目前,我在我的JTable
中初始化JPanel
,如此:
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
}
当我想修改JTable
我通过创建新的TableModel
数组并为我的所有单元格调用Object[][]
直接与fireTableCellUpdated(row, column)
进行互动。
我的问题是,在我的程序中的某个时刻,我的JTable
丢失了自定义渲染器。
我被告知这是因为它正在更新TableColumnModel
。
初始化JTable
以保持CellRenderers
的最佳方式是什么?
在JTable
的整个生命周期中保持不变?
答案 0 :(得分:2)
当我想修改表中的所有值时,我通过创建一个新的Object [] []数组并为我的所有单元格调用fireTableCellUpdated(row,column)直接与TableModel交互。
不,你不应该直接打电话给fireTableCellUpdated(...)
。这是TableModel的工作。数据的更改应通过TableModel完成,而不是像Array这样的外部数据存储。
如果要更改表中的数据,请使用TableModel的setValueAt(...)方法。
您始终可以向自定义TableModel添加clear(...)
方法,以重置内部数据。
初始化JTable的最佳方法是什么,以便CellRenderers在JTable的整个生命周期内保持不变?
取决于初始化的含义。使用DefaultTableModel时,您只需使用:
model.setRowCount(0);
并删除所有数据。
然后,您可以使用addRows(...)
方法动态添加数据。
我的问题是,在我的程序中的某个时刻,我的JTable丢失了它的自定义渲染器。我被告知这是因为它正在更新TableColumnModel。
是的,只要您执行以下操作:
table.setModel(...);
创建了一个新的TableColumnModel,您将丢失自定义渲染。使用上面的建议这不会有问题,因为你没有改变表的“结构”(只是删除了数据),所以不需要重新创建TableColumnModel。