[英]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.