java在DefaultCellEditor派生实例完成其工作后更新单元格渲染器
我使用JTable
,它有自己的单元渲染器和单元编辑器
例如,此表包含2列和x行:
第一列包含一个布尔值、它自己的单元渲染和单元编辑器(一个radiobutton)
第二列包含一个字符串值,即它自己的单元格渲染器:当当前行的第一列设置为true(选中radiobutton)时,它将使其变为粗体
编辑器会正确更新所有值,但当单选按钮设置为true时,第二行不会变为粗体
我必须检查另一行的单选按钮才能看到变化
我在哪里可以启动这些更改
干杯,谢谢你的帮助
RadiobuttonTableCellEditor。java
public class RadiobuttonTableCellEditor extends DefaultCellEditor
implements ItemListener {
JRadioButton rb = new JRadioButton();
public RadiobuttonTableCellEditor(JCheckBox pCheckBox) {
super(pCheckBox);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value == null)
return null;
rb.addItemListener(this);
rb.setSelected((Boolean)value);
return rb;
}
public void itemStateChanged(ItemEvent e) {
super.fireEditingStopped();
}
public Object getCellEditorValue() {
rb.removeItemListener(this);
return rb.isSelected();
}
}
# 1 楼答案
在那里扩展
DeafultCellEditor
似乎没有任何意义。实现这样的侦听器接口也不是一个好主意渲染器作为一个薄层工作得最好。如果另一个单元格应该更改,那么需要在表模型中反映出来,该模型应该触发一个相关的更新事件
# 2 楼答案
在表模型中,只要值发生变化,就必须触发相应的事件。如果您的模型是从
AbstractTableModel
继承的,那么可以使用几个fireXXX
方法。我猜你应该从setValueAt
方法调用它们如果你知道确切的列和行,你可以调用
fireTableCellUpdated
,否则你可能不得不使用fireTableChanged
,因为你必须更新不同的列当然,您应该正确地呈现新值