2012-05-09 4 views
3

Я отчаянно пытаюсь убедить мой JTable обновить, когда я изменяю его данные. Данные хранятся в глобальном singleton, TreeSet, с которым я работаю. Всякий раз, когда данные TreeSet s изменены, происходит событие для обновления TableModel. В целях тестирования я заменил это на простые Timer стрельбы.Обновление JTable не отображается

При каждом запуске события элемент из TreeSet удаляется для имитации изменений данных. Событие срабатывает, и TableClass получает его и обрабатывает его, как ожидалось, но когда дело доходит до обновления, ничего не происходит. Я пытался создать новый TableModel каждый раз, когда происходит событие, и установите его в глобальную таблицу. Изменения в singleton 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 [] []). Внутри метода я вызываю метод fireTableDataChanged(). Но угадайте, что? Тем не менее ничего не происходит. – JonasP

Смежные вопросы