2013-10-02 61 views
0

我爲我的JTable使用AbstractTableModel。更改特定JTable單元格中的數據

public class MyTableModel extends AbstractTableModel { 

    private List<String> columnNames = new ArrayList<String>(); 
    private List<List> data = new ArrayList(); 

    MyTableModel() { 
      columnNames.add("Action"); 
      columnNames.add("Count"); 
      columnNames.add("Total"); 
      columnNames.add("X"); 
      columnNames.add("Y"); 
      columnNames.add("Quarter"); 
      columnNames.add("Answer"); 
      columnNames.add("T (ms)"); 
    } 

    public void addRow(List rowData) { 
      data.add(rowData); 
      fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 

    public void insertRow(int index, List rowData) { 
      data.add(0, rowData); 
      fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 

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

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

    public String getColumnName(int col) { 
      try { 
       return columnNames.get(col); 
      } catch (Exception e) { 
       return null; 
      } 
    } 

    public Object getValueAt(int row, int col) { 
      return data.get(row).get(col); 
    } 


    public boolean isCellEditable(int row, int col) { 
      return false; 
    } 

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

我通過在一些不重要的類中執行某些代碼來添加新行(通過成功),同時應用程序正在運行。它看起來像這樣。

MyClass.MyTableModel.insertRow(0, (Arrays.asList(String.valueOf(valueOne), String.valueOf(valueTwo), String.valueOf(valueThree), 
        String.valueOf(valueFour), String.valueOf(valueFive), String.valueOf(valueSix), String.valueOf(valueSeven), 
        String.valueOf(valueEight), String.valueOf(valueNine)))); 
MyClass.myTable.setModel(MyClass.MyTableModel); 
MyClass.myTable.repaint(); 

但我不能在這些添加的行中更改特定單元格中的數據。我試圖覆蓋setValueAt()方法,但沒有成功。此外,我想簡單地調用方法setValueAt()爲MyClass.MyTableModel例如:

MyClass.MyTableModel.setValueAt("valueChange", 0, 6); 
MyClass.myTable.setModel(MyTableModel); 
MyClass.myTable.repaint(); 

這也不起作用。我試着爲我的模型調用fireTableCellUpdated()(我知道這是錯誤的做法),但它也嘗試失敗。你有什麼想法?

+0

爲了更好的幫助更快,發佈[SSCCE](http://sscce.org/)。 –

+0

請使用正確的大寫字母來提高可讀性;變量應該以小寫字母開頭,與「MyClass」及其字段「MyClass.MyTable」不同。 「不起作用」不是一個非常有用的錯誤描述。 –

+0

@AndrewThompson,我會記住,謝謝你,先生。他先生,我怎麼能更好地描述數據更新不起作用的情況,我不知道爲什麼?如果我知道爲什麼不會有這個問題。 – bluevoxel

回答

2

您不覆蓋setValueAt方法。默認情況下,這個方法什麼都不做。

例如...

public void setValueAt(Object value, int row, int column) { 
    List rowValues = date.get(row); 
    rowValues.set(column, value); 
    fireTableCellUpdated(row, col); 
} 

這是假設所有列可編輯。通常我會檢查傳入的值以確保它是指定列的正確類型,並應用可能需要完成的驗證,但我會讓您知道的,

您可能還想看看在How to use tables哪幾個例子

+0

我沒有嘗試在列表中獲取整行數據...您的解決方案非常完美。非常感謝您的先生! – bluevoxel

+0

@eLogic很高興看到今天有用的東西;) – MadProgrammer