JTable ArrayList 表示されない

このQ&Aのポイント
  • Jtableでファイルのリストを表示させたいが、要素のないArrayList型変数に入れるため、JTableに表示されない
  • 初期化をnullにするとaddが使えず、手直しが必要になる
  • どうすればJTableに要素を表示させることができるか助言を求めている
回答を見る
  • ベストアンサー

JTable ArrayList 表示されない

度々質問させて頂いてます。 Jtableでファイルのリストを表示させたいのですが、アプリ外(Windowsのエクスプローラ)からのD&Dしてきたファイルを、最初に要素のない状態で定義したArrayList型の変数?にいれる(addする)ので、はじめはArrayList型変数には知らない(意味を持たない)値が入っているか、JTableが、表示する範囲の要素がなくて困ってしまっているはずです。たぶんそのせいでJTableに表示されないんだと思います。(妄想です) nullで初期化しようとも考えたのですがそうするとaddが使えなくなってしまい(nullが入っているところの後ろからaddされる)、同じ班の人が作ってくれたクラスを手直し?しなくてはなりません。 どうすればいいでしょう。 ちょっと日本語がイカれてますができれば助けて欲しいです。 補足ならいくらでもします。 //TableModelクラス public class TableModel extends AbstractTableModel{ public static DataList mainList = new DataList(); TableModel(){ } @Override public int getColumnCount() { return 4; } @Override public int getRowCount() { return 1; } @Override public String getValueAt(int row, int column) { String fileName = mainList.GetData(row).GetName(); String lastModifiedDate = mainList.GetData(row).GetDate().toString(); String filePath = mainList.GetData(row).GetPath(); switch(column){ case 0: return null; case 1: return fileName; case 2: return lastModifiedDate; case 3: return filePath; default: return null; } } public String getColumnName(int column){ switch(column){ case 0: return null; case 1: return "ファイル名"; case 2: return "更新日時"; case 3: return "パス"; default: return null; } } } //DataListクラス public class DataList{ List<FileData> dataList; public DataList(){ this.dataList = new ArrayList<FileData>(); } // 末尾にデータを追加 public void AddData(FileData fd){ this.dataList.add(fd); } } FileDataクラスは単純にファイル名、パス、更新日時(Date型)を持つクラスです rowが1なのはいろいろ試したからで、実際は30行くらい表示していたいです。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

おっしゃっている通り、何をいっているかわからないので、 何を聞きたいのかよくわかりませんが、 気になった点をいくつか記載します。 ・DataListクラスの必要性が感じられません。 直接ArrayListでいいのては? ・getValueAt、getColumnNameでnullを返すケースがありますが、 これは問題ないでしょうか?確認してたほうがいいかと思います。 わからなければ、""を返した方が無難です。 ・getRowCountほコンスタントに1を返していますが、 これはデータ数を返すのがいいでしょう。 このままのソースでいくなら(先の指摘を反映しないなら)、 return mainList.dataList.size(); となります。 ・このコードだけでは判断できませんが、データ数やデータの内容等に変更があった場合には、 AbstractTableModelのfire~というメソッドを呼び出すことでJTableに 変更を通知する必要があります。 簡単に見ただけなんで、とりあえず、以上の点だけ指摘しておきます。

domybestatall
質問者

お礼

補足ありがとうございます。 質問を見てそういう指摘をしてくださるのは当然のことだと思います。内容不足でもうしわけありません。 >getValueAt、getColumnNameでnullを返すケースがありますが、 >これは問題ないでしょうか?確認してたほうがいいかと思います。 >わからなければ、""を返した方が無難です。 ドンピシャでございました(TдT) 勘でなんとなくnullにしてしまっていました。 本当にありがとうございました。これからに自分のプログラミング人生の大きな教訓になりましたm(_ _)m

関連するQ&A

  • SwingでJtableのヘッダ行が表示されません

    SwingでJtableのヘッダ行が表示されません 解決方法とどうして表示されなかったのか理由もできればお願いします。 import java.util.Vector; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class Table_Calendar extends JFrame{ Vector<String>[] data = new Vector[3]; public static void main(String args[]){ new Table_Calendar(); } public Table_Calendar(){ super(); // ウィンドウサイズ this.setSize(800, 600); // レイアウト this.setLayout(null); // ウィンドウクローズ時の処理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 1; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } }; JTable table = new JTable(tableModel); table.setLocation(10, 20); table.setSize(600,500); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.add(table); /*setBounds(int x,int y,int width,int height)*/ panel2.setBounds(10, 10, 700,700); this.add(panel2); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • SwingのJTableについて

    swingなのですが下記のプログラムで実現できない点があります。 1.isCellEditableメソッドを使ってセルを編集可能にしたのですが 編集した文字が消えてしまいます。 2.また、ボタンを配置してボタンを押下時に編集したセルの   行のデータをコンソールに表示したいのですがどうすればいいかわかりません。 3.画面レイアウトがsetLocation(x, y)した位置に表示されません。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class JTableSample4 implements ActionListener { static Vector<String>[] data = new Vector[3]; static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JPanel panel1 = new JPanel(); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); data[0].addElement("佐藤花子"); data[1].addElement("千葉県"); data[2].addElement("yyyyyyyyyy"); data[0].addElement("田中浩二"); data[1].addElement("埼玉県"); data[2].addElement("zzzzzzzzzz"); data[0].addElement("小川伸介"); data[1].addElement("新潟県"); data[2].addElement("aaaaaaa"); data[0].addElement("佐藤和也"); data[1].addElement("群馬県"); data[2].addElement("bbbbbbb"); data[0].addElement("渡辺悟"); data[1].addElement("愛知県"); data[2].addElement("ccccccc"); data[0].addElement("橋本智也"); data[1].addElement("愛媛県"); data[2].addElement("ddddddd"); data[0].addElement("永井祐二"); data[1].addElement("栃木県"); data[2].addElement("eeeeeee"); data[0].addElement("細貝昭二"); data[1].addElement("福岡県"); data[2].addElement("fffffff"); data[0].addElement("堀野友光"); data[1].addElement("長野県"); data[2].addElement("gggggggg"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 10; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } /******************セルの編集 可/不可を操作するメソッド**********************/ public boolean isCellEditable(int rowIndex, int columnIndex) { /*0が1カラム目 1が2カラム目なのでこの場合電話番号だけ編集可*/ if (columnIndex == 0 || columnIndex ==1) { /*falseは編集不可*/ return false; } else /*trueは編集可*/ return true; } }; JLabel label = new JLabel("電話番号だけがセルを編集することができます"); label.setLocation(10, 10); label.setSize(300, 20); JButton button = new JButton("Click Me!"); button.setLocation(10, 400); button.setSize(20, 20); //button.addActionListener(); JTable table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setLocation(10, 40); scrollPane.setSize(750, 180); panel1.add(button); panel1.add(label); panel1.add(scrollPane); panel1.setBounds(10, 10, 800, 230); frame.add(panel1); frame.setSize(800, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("test"); } }

    • ベストアンサー
    • Java
  • データ取得後、JTABLE列幅を変更できませんか

    データベースからデータを取得して(ResultSetMetaData)、Jtableに表示したのですが、列幅を項目ごとに変更したいのですが、できるのでしょうか? 項目ヘッダーはできたのですが。。。 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new ArrayList<String>(cnum); //列名の取得 String[] hder = {"月日","区分","コード","商品"}; for(int i=1; i<=cnum; i++){ colname.add(hder[i-1]); } //行の取得 data = new ArrayList<ArrayList>(); while(rs.next()){ ArrayList<String> rowdata = new ArrayList<String>(); for(int i=1; i<=cnum; i++){ if (rs.getObject(i)==null){ rowdata.add("");} else{ rowdata.add(rs.getObject(i).toString());} } data.add(rowdata); } 表示はできるのですが、各項目ごとに列幅が、しようとMaxsizeとかsetPreferredWidth などを行ってもうまくでいきません。

  • Struts2のiteratorタグの使い方

    Struts2でiteratorタグを使用したいのですがJSPでの記述方法がわからず困っています。 アクションクラス、JSPでは以下のように記述しております。 検索するとActionクラス内でArrayListに独自のクラスが格納されている状態での記述方法 はサンプルとしてあったのですがArrayListにStringが格納されていた場合の記述方法に 関しての記載が見つかりませんでした。そのため現在、JSP側ではsession.getattribute()を 使用してしのいでいる次第です。 public ArrayList<String> getDatalist() { return this.datalist; } public void setDatalist(ArrayList<String> datalist) { this.datalist = datalist; } public String execute() { ArrayList<String> datalist = bdf.getDataList(); return "success";    } 以下、JSP側の記述 <s:iterator value="datalist"> ここの記述が不明 </s:iterator>

    • ベストアンサー
    • Java
  • ArrayListを改良したい

    visual C# 2010 Express を使用しています。 ArrayListは動的に要素を追加できるの便利なのですが、 次のような使い方で要素を取り出そうとするとasキャストが必要になってしまいます・・・ class Data : Dictionary<string, string> { } class DataList : ArrayList { public void Add(Data value) { base.Add(value as Data); } } class Program { static void Main(string[] args) { var d = new Data(); d["a"] = "aa"; d["b"] = "bb"; DataList arr = new DataList(); arr.Add(d); // var dd = arr[0] as Data; var dd = arr[0]; Console.WriteLine(dd["a"]);// エラー 角かっこ [] 付きインデックスを 'object' 型の式に適用することはできません。 Console.ReadLine(); } } そこでというか、ラップした独自のクラスを作りたいと思い上のような感じで作成したのですが、 やはり同じエラーになってしまいます・・・ asキャストを必要とせず、そのままDataクラス(Dictionary<string, string>)を 取り出すためにはどのように作成したら良いのでしょうか?

  • javaのJTableのupdateについて

    javaのJTableについて質問します。 Q1)下記のコードは元のtabledataをupdateしていますが、updateの内容を元のtabledataに 反映する設定はありますか(元のtabledataの内容は変化します)? =========================================== import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.table.DefaultTableModel; public class SwingTest extends JFrame{ private String[][] tabledata = { {"日本", "3勝", "0敗", "1分"}, {"クロアチア", "3勝", "1敗", "0分"}, {"ブラジル", "1勝", "2敗", "1分"}, {"オーストラリア", "2勝", "2敗", "0分"}}; private String[] tabledata2 = {"イギリス", "2勝", "0敗", "2分"}; private String[] columnNames = {"COUNTRY", "WIN", "LOST", "EVEN"}; public static void main(String[] args){ SwingTest test = new SwingTest("SwingTest"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } SwingTest(String title){ setTitle(title); setBounds( 10, 10, 300, 200); DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); JTable table = new JTable(tableModel); for(int i = 0 ; i < 4 ; i++){ tableModel.addRow(tabledata[i]); } tableModel.setValueAt("2勝", 1, 1); tableModel.setValueAt("2敗", 1, 2); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 90)); JPanel p = new JPanel(); p.add(sp); getContentPane().add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • ArrayListなかへのArrayListオブジェクトのセット方法

    スケジュールのプログラムを作成していまして、1日分のオブジェクトをArrayListにいれて、さらに、1日分のArrayLisのオブジェクトを1ヶ月のArrayListにいれました。 そこで、1ヶ月のArrayListのオブジェクトから1日のArrayListのオブジェクトに分解して、表示したところに、最後の日にちの件数が表示されました。 1.ArrayListにオブジェクトをいれますと、うまく表示されます。 2.ArrayListにArrayListオブジェクトをいれまして、総件数を表示したら、1日から31日までのArrayListのsizeメソッドが最後の日にちが表示されます。よって1日から30日のArrayListに31日分のArrayListが上書きされているように思われます。 1と2の違いと原因をご教授下さい。 //arraylist作成1ヶ月分。 public ArrayList setMonth(int year,int month,int user_id){ -省略- ArrayList monthList=null; for(int count=1; count<=day; count++){ monthList=new ArrayList(); ArrayList dayList=new ArrayList(); dayList=setDay(year,month,count); monthList.add(dayList); } for(int a=0; a<monthList.size(); a++){ ArrayList saa = (ArrayList)monthList.get(a); int mm= saa.size(); System.out.println("mm:"+mm); } return monthList; -省略- } //ArrayList作成1日分 public ArrayList setDay(int year,int month,int day){ ArrayList aList = new ArrayList(); -省略- while(rs.next()){ Allday schAll=new Allday(); schAll.setSchedule_id(rs.getInt("schedule_id")); schAll.setContents(rs.getString("contents")); aList.add(schAll); } for(int b=0; b<aList.size(); b++){ int si= ((Allday)aList.get(b)).getSchedule_id(); String con=((Allday)aList.get(b)).getContents(); } return aList; -省略- }

    • ベストアンサー
    • Java
  • スクロール表示

    お願いします。 初めてswingに挑戦中なのですが・・・ tableをスクロール表示させたいのですがどうしてもできません。どうしたらよいでしょうか?教えてください import java.lang.*; import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class SwingTableApp extends JFrame { public JTable table; public JLabel label; public SwingTableApp(String[][] data) { super("parallel Machine Scheduling"); setLocation(50,50); setSize(400,700); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(null); DefaultTableModel tableModel = new DefaultTableModel(); for(int k=0; k<data[0].length; k++){ tableModel.addColumn("TEST"); }//列の設定 for(int j=0; j<data.length; j++){ tableModel.addRow(data[j]); }//行の設定 table = new JTable(tableModel); table.setLocation(10,10); table.setSize(2000,200); getContentPane().add(table); label = new JLabel("目的関数"); label.setLocation(10,210); label.setSize(100,25); getContentPane().add(label); } }

    • ベストアンサー
    • Java
  • ArrayListを使った多次元配列の比較方法

    JAVAでArrayListを使った多次元配列の要素を比較方法で困っています。 下記のコードで、アイテム、数量、金額をランダムに10個配列に追加しています。 private ArrayList<Item> list; public ArrayList<Item> getItems1() { return list; } public void setItems(ArrayList<Item> items) { getItems(); } public Inventory() { list = new ArrayList<Item>(); } public void getItems(){ for(int i =0; i<10; i++){ int theItemType = (int)(Math.random()*6+1); int theQut = (int)(Math.random()*20+1); int thePrice = (int)(Math.random()*40+101)/20; list.add(new Item(theItemType, theQut, thePrice)); } } public String getItemName() { if(itemType == 1){ return "シャツ"; } if(itemType == 2){ return "スカート"; } if(itemType == 3){ return "ズボン"; } if(itemType == 4){ return "ネクタイ"; } if(itemType == 5){ return "靴"; } if(itemType == 6){ return "靴下"; } return null; } public String toString() { return getItemName() + " , " + getQut() + " " + getPrice(); } 同じアイテム、金額の場合は、数量を合計して表示させたいです。例えば、配列の要素が下記のような場合、1つ目と2つ目の要素は同じアイテム、金額になるので、数量を20として表示させたいのですが、どのように比較していいのかわかりません。どなたか教えてください。よろしくお願いします。 靴下 , 4, 5 靴下 , 16, 5 ネクタイ , 3, 5 ネクタイ , 16, 6 ネクタイ , 2, 6 ズボン , 16, 6 ズボン , 15, 6 スカート , 3, 6 靴 , 17, 7 シャツ , 17, 7

    • ベストアンサー
    • Java
  • JavaのJTableのセル単体の色設定

    今日は JavaのJtableの『マウスで選択したセル』の色を赤色に設定するコードを書きましたが、セル単体でバックグランドの色が変更できまず、行単位で変更されます。 又、変更のタイミングは、他のセルを、マウス選択したときに、以前のセルの行が赤く変更になります。 Q1)セル単体で、バックグランドの変更を行い、その変更タイミングは、クリックと同時に  行う様に改善したく質問いたします。 注)Java暦は、初心者で約2週間ですが。下記にソースを添付いたしますので、宜しくお願いいたします。 //============================== package packageA; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("T"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 400, 200); setTitle(name); String d[][] = { {"A","8","7"}, {"B","6","5"}, {"C","7","6"} }; String t[] = {"名","数","英"}; DefaultTableModel tm = new DefaultTableModel(d,t); final JTable tablex = new JTable(tm); /* final JTable tablex = new JTable(tm){ @Override public Component prepareRenderer(TableCellRenderer tcr, int row, int column) { Component c = super.prepareRenderer(tcr, row, column); if (row == 2 && column == 2) { c.setForeground(Color.BLUE); c.setBackground(Color.RED); } else { c.setForeground(getForeground()); c.setBackground(getBackground()); } return c; } }; */ tablex.addMouseListener( new java.awt.event.MouseAdapter() { public void mousePressed(MouseEvent e) { int row=tablex.getSelectedRow(); int col=tablex.getSelectedColumn(); // TableCellRenderer tcr = tablex.getCellRenderer(row,col); // Component c = tablex.prepareRenderer(tcr,row,col); Component c = tablex.getComponentAt(row,col); c.setForeground(Color.BLUE); c.setBackground(Color.RED); System.out.println(" "+row+" "+col); } } ); JPanel p1 = new JPanel(); JScrollPane sp1 = new JScrollPane(tablex); sp1.setPreferredSize(new Dimension(250, 80)); p1.add(sp1); getContentPane().add(p1, BorderLayout.NORTH); } }

    • ベストアンサー
    • Java

専門家に質問してみよう