我有一个JTable,其中几列被绘成复选框。我想要做的是通过选中/取消选中B列中相应的复选框来启用/禁用A列中的复选框。
我已经设法在this example的基础上完成了这项工作,但我对新启用/禁用的复选框有疑问 - 它们无法正常刷新。仅在我单击表格中的任何其他单元格后,才会刷新最后启用/禁用的复选框。
问题看起来像这样(“参考结构”列是启用/禁用复选框的列):
未启用复选框:
未禁用复选框:
这是我的JTable代码:
public class StructuresJTable extends JTable {
public StructuresJTable() {
super();
}
public StructuresJTable(TableModel dm) {
super(dm);
}
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row,
int col) {
Component c = super.prepareRenderer(renderer, row, col);
if (col == StructuresTableModel.COMPARISON_REF_STRUCT_COL) {
c.setEnabled((Boolean) this.dataModel.getValueAt(row,
StructuresTableModel.COMPARE_COL));
} else {
c.setEnabled(true);
}
return c;
}
}
您对如何使其有效有任何建议吗?
答案 0 :(得分:3)
更新:使用prepareRenderer()
与实施TableCellRenderer
并不如正确调整模型那么重要。如果模型正确,则视图将跟随。您需要合适的model,renderer and editor。
模型:您需要一些数据结构来保存每个单元格的状态。在TableModel
的实现中,覆盖setValueAt()
以在发生更改时调整模型中每个单元格的所需状态。
渲染器:在TableCellRenderer
中,覆盖getTableCellRendererComponent()
以调整模型中指定的每个单元格的渲染器。
编辑:隐含地使用here的DefaultCellEditor
就足够了。
答案 1 :(得分:2)
我没有看过你的代码,但通常使用Swing表,列表和树,渲染器实例被重用来绘制很多行。您需要告诉JTable其内容已更改,以便它可以重绘相关的行。使用该模型通知其TableModelListeners某些行已更改。