2015-10-22 36 views
0

目前我初始化我JTableJPanel像這樣:用自定義渲染器初始化動態JTable的最佳方式是什麼?

private ArrayData data; 
private JTable table; 
private CustomTableModel model; 

public ExtendedJPanel() { 
    data = ArrayData.getData(); 

    model = new CustomTableModel(data); 
    table = new JTable(model); 

    TableColumn col = table.getColumnModel().getColumn(0); 
    col.setCellRenderer(new Column0Renderer()); 
    col = table.getColumnModel().getColumn(1); 
    col.setCellRenderer(new Column1Renderer()); 

    // do some other stuff 
} 

當我想直接通過創建一個新Object[][]陣列,並呼籲fireTableCellUpdated(row, column)以修改JTable

我與TableModel交互的所有值爲我所有的細胞。

我的問題是,在我的程序的某個時候,我的JTable失去了自定義渲染器。

我被告知這是因爲它正在更新TableColumnModel

什麼是初始化一個JTable使得CellRenderers住宿 整個JTable的生活不斷的最佳方式?

回答

2

當我想修改表中的所有值時,我通過創建一個新的Object [] []數組併爲所有單元格調用fireTableCellUpdated(row,column)直接與TableModel交互。

不,您不應該直接致電fireTableCellUpdated(...)。這是TableModel的工作。數據的改變應該通過TableModel完成,而不是像Array那樣的外部數據存儲。

如果要更改表中的數據,請使用TableModel的setValueAt(...)方法。

您可以隨時將clear(...)方法添加到您的自定義TableModel中,以重置內部數據。

初始化JTable的最佳方式是什麼,以便CellRenderer在JTable的整個生命週期中保持不變?

取決於你初始化的意思。當使用DefaultTableModel時,您可以使用:

model.setRowCount(0); 

並且所有的數據都被刪除。

然後您可以使用addRows(...)方法來動態添加數據。

我的問題是,我在程序的某個時刻,我的JTable中失去了它的自定義渲染。我被告知這是因爲它正在更新TableColumnModel。

是的,只要你做這樣的事情:

table.setModel(...); 

新TableColumnModel中創建和你失去了你的自定義呈現。使用我的建議上面這不會是一個問題,因爲你沒有改變表的「結構」(只是刪除數據),所以沒有必要重新創建TableColumnModel。

+0

我從來沒有真正調用過table.setModel(...);''我擁有的是'TableModel'中的一個自定義方法,它爲新的'Object [] []'換掉舊的Object [] []'。所以我的TableModel保持不變。 我最關心的是ColumnModel正在改變和失去我的渲染器。我不確定這是爲什麼,因爲我沒有_think_我在任何時候重新驗證表。 – RhetoricalQuestions

+0

'我從來沒有真正調用過table.setModel(...);'我說「類似」。如果你沒有這樣做,那麼在調用引發TableColumnModel的fireXXX()方法時,交換代碼會被重新創建。您自定義TableModel中的代碼導致了問題。 – camickr

+0

因此,假設調用'fire ...()'方法對於手動調用通常是不安全的,那麼我會安全嗎? – RhetoricalQuestions

相關問題