有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();
}
}

共 (2) 个答案

  1. # 1 楼答案

    在那里扩展DeafultCellEditor似乎没有任何意义。实现这样的侦听器接口也不是一个好主意

    渲染器作为一个薄层工作得最好。如果另一个单元格应该更改,那么需要在表模型中反映出来,该模型应该触发一个相关的更新事件

  2. # 2 楼答案

    在表模型中,只要值发生变化,就必须触发相应的事件。如果您的模型是从AbstractTableModel继承的,那么可以使用几个fireXXX方法。我猜你应该从setValueAt方法调用它们

    如果你知道确切的列和行,你可以调用fireTableCellUpdated,否则你可能不得不使用fireTableChanged,因为你必须更新不同的列

    当然,您应该正确地呈现新值