通过选中其他列中的一个来启用和禁用JTable

时间:2012-06-29 01:36:03

标签: java swing checkbox jtable jcheckbox

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

我已经设法在this example的基础上完成了这项工作,但我对新启用/禁用的复选框有疑问 - 它们无法正常刷新。仅在我单击表格中的任何其他单元格后,才会刷新最后启用/禁用的复选框。

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

未启用复选框:

Checkbox not enabled

未禁用复选框:

Checkbox not disabled

这是我的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;
}

}

您对如何使其有效有任何建议吗?

2 个答案:

答案 0 :(得分:3)

更新:使用prepareRenderer()与实施TableCellRenderer并不如正确调整模型那么重要。如果模型正确,则视图将跟随。您需要合适的modelrenderer and editor

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

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

  • 编辑:隐含地使用hereDefaultCellEditor就足够了。

答案 1 :(得分:2)

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