Java 在DefaultCellEditor派生实例完成其工作后更新单元渲染器

Java 在DefaultCellEditor派生实例完成其工作后更新单元渲染器,java,swing,jtable,Java,Swing,Jtable,我使用一个JTable,它有自己的单元渲染器和单元编辑器 例如,此表包含2列和x行: 第一列包含一个布尔值、它自己的单元渲染和单元编辑器(一个radiobutton) 第二列包含一个字符串值,即它自己的单元格渲染器:当当前行的第一列设置为true(选中radiobutton)时,它将使其变为粗体 编辑器会正确更新所有值,但当单选按钮设置为true时,第二行不会变为粗体… 我必须检查另一行的单选按钮以查看更改 我在哪里可以启动这些更改 干杯,谢谢你的帮助 RadiobuttonTableCell

我使用一个
JTable
,它有自己的单元渲染器和单元编辑器

例如,此表包含2列和x行:
第一列包含一个布尔值、它自己的单元渲染和单元编辑器(一个radiobutton)
第二列包含一个字符串值,即它自己的单元格渲染器:当当前行的第一列设置为true(选中radiobutton)时,它将使其变为粗体

编辑器会正确更新所有值,但当单选按钮设置为true时,第二行不会变为粗体…
我必须检查另一行的单选按钮以查看更改

我在哪里可以启动这些更改

干杯,谢谢你的帮助


RadiobuttonTableCellEditor.java


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


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

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

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


当然,渲染器应该正确地渲染新值。

我想它可以帮助有类似问题的人,使
true
单选按钮在一行中唯一,您必须扩展
DefaultTableModel
来修改其行为,尤其是
setValueAt
方法

干杯



那么,您能告诉我如何正确地编写这样的代码吗?感谢您的帮助,我添加了一个JTable的成员声明,在调用getTableCellEditorComponent时引用了该声明。然后,getCellEditorValue被称为I状态:如果(table!=null){((AbstractTableModel)table.getModel()).fireTableDataChanged();}即使它可能有效,您的方法也不正确。您应该在表模型中调用fireXXX方法以响应数据的更改。在任何情况下,都不应在渲染器或编辑器中执行此操作。这个想法很简单。编辑器将使用model.setValueAt方法将新值保存到模型中。然后,模型应该让所有相关方知道数据已更改。您的渲染器和编辑器将自动响应更改。
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();
}
}
/**
 * When <code>column</code> is the column that contains the Boolean (in fact the radio button):
 * If aValue == false and that it had a previous value set to true we don't do anything
 * If aValue == true and that it had a previous value set to false, we set all the other booleans to false and this one to true
 */
@Override
public void setValueAt(Object aValue, int row, int column) {
    if (column == colonneBoutonradio)
    {
        if (((Boolean)aValue && !(Boolean)super.getValueAt(row, column)))
            for (int i = 0; i < this.getRowCount(); i++)
                // i==row permet de vérifier si la ligne courante est celle à modifier (et donc celle à mettre à true)
                super.setValueAt(i==row, i, colonneBoutonradio);
    }
    else
        super.setValueAt(aValue, row, column);
}