2012-05-09 19 views
3

データを変更したときに私のJTableがリフレッシュすることを切望しています。データはグローバルシングルトンTreeSetに保存されています。 TreeSetのデータが変更されるたびに、イベントが発生してTableModelが更新されます。テストの目的のために、私は単純なTimerの発砲イベントでこれを置き換えました。JTableリフレッシュが表示されない

イベントが発生するたびに、TreeSetの要素が削除され、データの変化をシミュレートします。イベントが発生し、TableClassはそれを受け取り、期待どおりに処理しますが、リフレッシュする場合は何も起こりません。イベントが発生するたびに新しいTableModelを作成してグローバルテーブルに設定しようとしました。シングルトンTreeSetの変更は行われますが、JTableには何も起こりません。

public class TreeTableObj implements ActionListener{ 
public JTable table ; 

public TreeTableObj(){ 
    MyTableModel myModel = new MyTableModel(getValuesOfTreeSet(), getTreeSetRows()); 

    table = new JTable(myModel){ //some rendering }; 

    table.setAutoCreateRowSorter(true); 
    } 

    class MyTableModel extends AbstractTableModel { 
     private String[] columnNames; 
     private Object[][] data ; 


     public MyTableModel(Object[][] data, String[] columnNames){ 
      this.data = data; 
      this.columnNames = columnNames; 
      System.out.println("Model created"); 
     } 

     public int getColumnCount() { 
      return columnNames.length; 
     } 

     public int getRowCount() { 
      return data.length; 
     } 

     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     public Object getValueAt(int row, int col) { 
      return data[row][col]; 
     } 

     public void setData(Object[][] data){ 
      this.data = data; 
      fireTableDataChanged(); 
     } 


     public Class getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 


     public boolean isCellEditable(int row, int col) { 
      if (col < 2) { 
       return false; 
      } else { 
       return true; 
      } 
     } 


     public void setValueAt(Object value, int row, int col) { 
      if (true) { 
       System.out.println("Setting value at " + row + "," + col 
            + " to " + value 
            + " (an instance of " 
            + value.getClass() + ")"); 
      } 

      data[row][col] = value; 
      fireTableCellUpdated(row, col); 

      if (true) { 
       System.out.println("New value of data:"); 
       printDebugData(); 
      } 
     } 

     private void printDebugData() { 
      int numRows = getRowCount(); 
      int numCols = getColumnCount(); 

      for (int i=0; i < numRows; i++) { 
       System.out.print(" row " + i + ":"); 
       for (int j=0; j < numCols; j++) { 
        System.out.print(" " + data[i][j]); 
       } 
       System.out.println(); 
      } 
      System.out.println("--------------------------"); 
     } 
    } 

    public void refreshTableModel(){ 
     FlightsTreeSet.getInstance().remove(FlightsTreeSet.getInstance().first()); 
     table.setModel(new MyTableModel(getValuesOfTreeSet(), getTreeSetRows())); 
     } 

    public void actionPerformed(ActionEvent arg0) { 
     refreshTableModel();  
    } 
} 

助けてください!

[EDIT1]

私は、問題の中核に近づいています: 私はJFrameの中に表示されているテーブルは、私が変える一つとして、別の参照を保持していることが分かりました。私はすべての変更を可視化し、モデルに適用しました。

答えて

1

問題が見つかりました。他の人が見つけられる答えを残す... 表示されたJTableと私が編集していたものが異なった参照([EDIT1]参照)を保持していることを知った後、私はJTableの2つの異なるオブジェクトを作成していました。 1つは表示され、もう1つはmain()にあり、ActionListenerになります。リスナーはイベントを受け取り、変更を加えましたが、他の人は何も起こっていないことに気付きませんでした。

2

コードに何かがありませんか? JTableがデータにアクセスするために使用するすべてのメソッド(getColumnCount()getValueAt()など)が欠落しているため、テーブルモデルはコンパイルしないでください。

また、新しいモデルを作成する必要はありませんあらゆる変更に - ちょうどモデルfireTableStructureChanged()がある。

+0

セットの変更でテーブルの列を変更する必要がない場合、fireTableDataChanged()はより適切なイベントになります。 –

+0

私はsetData(Object [] [] data)メソッドを呼び出すことでそれを試しました。メソッドの中で私はfireTableDataChanged()メソッドを呼び出します。しかし、何を推測する?まだ何も起こらない。 – JonasP

関連する問題