使用自定义渲染器初始化动态JTable的最佳方法是什么?

时间:2015-10-22 15:56:27

标签: java swing jtable initialization tablecellrenderer

目前,我在我的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的整个生命周期中保持不变?

1 个答案:

答案 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。