2

我有一个 JTable,其中几列被绘制为复选框。我想要做的是通过选中/取消选中 B 列中的相应复选框来启用/禁用 A 列的复选框。

我已经设法根据这个例子做到了,但是我对新启用/禁用的复选框有一个问题——它们没有正确刷新。只有在我单击表格中的任何其他单元格后,才会刷新最后启用/禁用的复选框。

问题看起来像这样(“参考结构”列是启用/禁用复选框的列):

复选框未启用:

复选框未启用

复选框未禁用:

复选框未禁用

这是我的 JTable 代码:

public class StructuresJTable extends JTable {

public StructuresJTable() {
    super();
}

public StructuresJTable(TableModel dm) {
    super(dm);
}

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row,
        int col) {
    Component c = super.prepareRenderer(renderer, row, col);
    if (col == StructuresTableModel.COMPARISON_REF_STRUCT_COL) {
        c.setEnabled((Boolean) this.dataModel.getValueAt(row,
                StructuresTableModel.COMPARE_COL));
    } else {
        c.setEnabled(true);
    }
    return c;
}

}

你对如何使它工作有什么建议吗?

4

2 回答 2

3

更新:使用prepareRenderer()与实施TableCellRenderer并不像正确调节模型那么重要。如果模型正确,则视图将随之而来。你需要一个合适的模型渲染器和编辑器

  • 模型:您需要一些数据结构来保存每个单元格的状态。在您的 实现中TableModel,覆盖setValueAt()以在发生更改时调整模型中每个单元格的所需状态。

  • 渲染器:在您的, 中TableCellRenderer,覆盖getTableCellRendererComponent()以调整模型中指定的每个单元格的渲染器。

  • 编辑:这里DefaultCellEditor隐式使用的 应该足够了。

于 2012-06-29T03:09:18.847 回答
2

我没有看过你的代码,但一般来说,对于 Swing 表、列表和树,渲染器实例被重用以绘制许多行。您需要告诉 JTable 其内容已更改,以便它可以重绘相关行。使用模型通知其 TableModelListeners 某些行已更改。

于 2012-06-29T01:51:21.760 回答