2012-05-09 113 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的兩個不同的對象。一個要顯示,另一個在main()成爲ActionListener。監聽者收到事件並做了更改,但另一個人從未注意到發生了任何事情。

2

你的代碼中缺少什麼?你的表格模型,因爲它是不應該編譯,因爲它缺少所有的JTable將用於訪問數據(getColumnCount()getValueAt()等)

同樣的方法,你不應該創建一個新的模型在每一個變化 - 只需要模型fireTableStructureChanged()

+0

如果集合中的更改不需要更改表格列,那麼fireTableDataChanged()將會是更好的擬合事件。 –

+0

我嘗試通過調用setData(Object [] [] data)方法。在方法內我調用fireTableDataChanged()方法。但猜猜怎麼了?仍然沒有發生。 – JonasP