【问题标题】:JTable set disabled checkbox look for uneditable cellJTable 设置禁用复选框查找不可编辑的单元格
【发布时间】:2014-12-17 14:52:28
【问题描述】:

我有一个带有布尔值列的 JTable。根据存储在模型中的状态,我将它们中的部分或全部设为不可编辑(模型的isCellEditable() 返回 false)。但是,这不会使 JTable 布尔渲染器将复选框渲染为禁用不可编辑单元格。

除了编写自定义布尔渲染器之外,还有其他方法可以实现吗?

如果我需要编写自己的渲染器,除了JCheckbox,我应该扩展什么类?我只需要在渲染之前禁用复选框,并且不想实现所有渲染代码并处理选定的外观和东西。

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)。
  • 同意 SSCCE/MCVE,短,可运行,可编译,在局部变量中具有 JTable/XxxTableModel 的硬编码值

标签: java swing jtable boolean jcheckbox


【解决方案1】:

但是,这不会使 JTable 布尔渲染器将复选框渲染为禁用不可编辑单元格。

这是正确的,因为这是默认渲染器的行为:JCheckBox 是不可编辑但不是禁用

除了编写自定义布尔渲染器之外,还有其他方法可以实现吗?

没有,据我所知。

如果我需要编写自己的渲染器,除了 JCheckbox,我应该扩展什么类?

扩展任何类以实现TableCellRenderer 接口不是强制性的。您可以完美地将JCheckBox 作为渲染器的类成员。实际上,组合优于继承。

我只需要在渲染之前禁用该复选框,并且不想实现所有渲染代码并处理选定的外观和东西。

这并不难,您可以控制正在发生的事情。考虑下面的例子:

class CheckBoxCellRenderer implements TableCellRenderer {

    private final JCheckBox renderer;

    public CheckBoxCellRenderer() {
        renderer = new JCheckBox();
        renderer.setHorizontalAlignment(SwingConstants.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Color bg = isSelected ? table.getSelectionBackground() : table.getBackground();
        renderer.setBackground(bg);
        renderer.setEnabled(table.isCellEditable(row, column));
        renderer.setSelected(value != null && (Boolean)value);
        return renderer;
    }
}

有关相关问题,请参阅此问答:JXTable: use a TableCellEditor and TableCellRenderer for a specific cell instead of the whole column

【讨论】:

    【解决方案2】:

    如果没有一个工作示例,很难准确地说出哪里出了问题,但听起来您可能忘记触发表修改事件来通知 JTable 它需要重新绘制自身。当您进行更改时,您的模型中需要这样的东西:

    fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol));
    

    您可以触发不同的表更改事件,并且可以将不同的参数传递给 TableModelEvent 构造函数。您可以在此处的 Javadocs 中找到更多信息:http://docs.oracle.com/javase/8/docs/api 和此处的 Java 教程:http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire。您需要阅读这些内容,以确定哪些内容适合您的特定情况。

    我怀疑是否需要自定义布尔渲染器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2013-06-04
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多