2014-10-22 53 views
1

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

有没有办法如何实现这个比编写自定义布尔渲染器?

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

+2

为了更好地帮助越早,张贴[MCVE(http://stackoverflow.com/help/mcve)(最小完整可验证示例)。 – 2014-10-22 07:55:39

+0

与SSCCE/MCVE一致,短,可运行,可编译,硬编码值用于局部变量中的JTable/XxxTableModel – mKorbel 2014-10-22 10:13:09

回答

0

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

我怀疑自定义布尔渲染器是必需的。

2

但是,这不会使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

相关问题