【发布时间】:2014-10-02 07:19:27
【问题描述】:
我有一个由 6 列组成的 JXTable 化合物,其中两个是 JCheckBox。我希望有以下行为:
- 如果第一个复选框被选中,则第二个复选框被启用并且可以选中或不选中。
- 如果未选中第一个复选框,则必须禁用并取消选中第二个复选框。
我用 Photoshop 编辑了一张图像以显示所需的结果:
对于CheckOne 和CheckTwo 列,我使用自定义TableCellEditor 和TableCellRenderer:
public class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor {
private static final long serialVersionUID = 1L;
private JCheckBox checkBox = new JCheckBox();
public CheckBoxCellEditor() {
checkBox.setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
checkBox.setSelected(value==null ? false : (boolean)value);
return checkBox;
}
@Override
public Object getCellEditorValue() {
return checkBox.isSelected();
}
}
public class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer{
private static final long serialVersionUID = 1L;
public CheckBoxCellRenderer() {
setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setSelected(value==null ? false : (boolean)value);
return this;
}
}
这就是我设置它们的方式:
//CheckOne
table.getColumn(4).setCellEditor(new CheckBoxCellEditor());
table.getColumn(4).setCellRenderer(new CheckBoxCellRenderer());
//CheckTwo
table.getColumn(5).setCellEditor(new CheckBoxCellEditor());
table.getColumn(5).setCellRenderer(new CheckBoxCellRenderer());
我尝试将PropertyChangeListener 添加到JXTable 并从那里实现该行为,但我无法完成它。
然后我意识到我的自定义编辑器和渲染器同时更改了所有列组件,而不仅仅是所需的组件。
所以,我尝试在TableCellEditor 和TableCellRenderer 和PropertyChangeListener 中进行更改,但我还是想不通。
【问题讨论】:
-
J(X)Table 已将 JCheckBox 实现为 Renderer/Editor,剩下的问题是关于模型中的方法,例如setValueAt 应该是
标签: java swing tablecellrenderer tablecelleditor jxtable