繁体   English   中英

JTable set disabled复选框查找不可编辑的单元格

[英]JTable set disabled checkbox look for uneditable cell

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

除了编写自定义布尔渲染器之外,有没有办法解决这个问题?

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

但是,这不会使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:对特定单元格使用TableCellEditor和TableCellRenderer而不是整列

如果没有一个工作示例,很难确切地说出错误是什么,但听起来您可能忘记触发表修改事件来通知它需要重绘自己的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 您需要阅读这些内容,以确定哪些适合您的特定情况。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM