我有JTable
的布尔值列。根据模型中存储的状态,我可以使其中的部分或全部不可编辑(模型的isCellEditable()
返回false)。但是,这不会使JTable
布尔渲染器将复选框呈现为不可编辑单元格的禁用。
除了编写自定义布尔渲染器之外,还有办法解决这个问题吗?
如果我需要编写自己的渲染器,我应该扩展哪个类而不是JCheckbox
?我只是需要在渲染之前禁用复选框,并且不希望实现所有渲染代码并处理选定的外观和内容。
答案 0 :(得分:4)
但是,这不会使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
答案 1 :(得分: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。您需要阅读这些内容,以确定哪些适合您的特定情况。
我怀疑是否需要自定义布尔渲染器。