【问题标题】:JTable enable and disable checkbox by checking one in other columnJTable 通过选中另一列中的一个来启用和禁用复选框
【发布时间】:2012-06-30 14:05:17
【问题描述】:

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

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

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

复选框未启用:

复选框未禁用:

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

}

你有什么建议可以让它发挥作用吗?

【问题讨论】:

    标签: java swing checkbox jtable jcheckbox


    【解决方案1】:

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

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

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

    • 编辑:DefaultCellEditor,隐式使用here,应该足够了。

    【讨论】:

    • @mKorbel:你是对的;视图应自动反映更新后的模型。
    • @mKorbel 你的例子重绘了整个表,我不想在我的 TableModelListener 中有 JTable 字段。它有效,但我发现在 TableModel setValue() 方法中调用 fireTableRowsUpdated(row, row) 更可取。
    • @lasjak:是的,TableModel 的实现必须通知它正在侦听JTable 视图;一行是最小的合理更新。
    • @lasjak whaaaaaat,拜托......这是关于在 JTable API 中实现的方法,而不是关于 prepareXxx,1) 然后不要使用 prepareXxx 并创建一个大多数,确保退后两步, 2)将我的评论作为私人讨论,
    【解决方案2】:

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

    【讨论】:

    • 我认为不是这样,JTable 不需要 repaint(),请看我在 (@trashgod) 帖子中的评论
    • 谢谢,调用 fireTableRowsUpdated(row, row);在我的 TableModel setValue() 方法中起作用了。
    • -1 用于建议 repaint() - 如果模型正确实现,则从不需要
    • @kleopatra:你当然是对的,我会删除这个建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多