【问题标题】:What is the best way to initialise a dynamic JTable with custom renderers?使用自定义渲染器初始化动态 JTable 的最佳方法是什么?
【发布时间】:2015-10-22 15:56:26
【问题描述】:

目前我在我的JPanel 中初始化我的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
}

当我想修改JTable中的所有值时

我通过创建一个新的Object[][] 数组并为我的所有单元格调用fireTableCellUpdated(row, column) 直接与TableModel 交互。

我的问题是,在我的程序中的某个时刻,我的 JTable 丢失了它的自定义渲染器。

有人告诉我这是因为它正在更新TableColumnModel

初始化JTable 以使CellRenderers 保持不变的最佳方法是什么 在JTable 的整个生命周期中保持不变?

【问题讨论】:

    标签: java swing jtable initialization tablecellrenderer


    【解决方案1】:

    当我想修改表中的所有值时,我通过创建一个新的 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。

    【讨论】:

    • 我从未真正调用过table.setModel(...); 我拥有的是TableModel 中的自定义方法,它将旧的Object[][] 替换为新的Object[][]。所以我的 TableModel 保持不变。我主要关心的是 ColumnModel 更改并丢失了我的渲染器。我不确定为什么会这样,因为我不认为我不会在任何时候重新验证表格。
    • I never actually call table.setModel(...); 好吧,我说的是“类似”。如果您不这样做,那么您在调用 fireXXX() 方法时的交换代码会导致重新创建 TableColumnModel。您自定义 TableModel 中的代码导致了问题。
    • 那么我可以假设调用 fire...() 方法对于手动调用通常是不安全的吗?
    • 不,它们不是不安全的,它们是必要的,以便表格在进行更改时重新绘制自身。但它们只能由 TableModel 调用,因为只有表模型应该知道数据何时发生变化。问题是您的 TableModel 代码调用了错误的 fireXXX() 方法。由于您已经发布了自定义 TableModel,我们无法猜测您在做什么。如果您希望人们提供帮助,请在发布问题时发布正确的 SSCCE
    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 2010-09-17
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2012-02-08
    • 2012-01-28
    • 2016-02-09
    相关资源
    最近更新 更多