0

我使用JTable具有自己的单元格渲染器和单元格编辑器的 a。

比如说,这个表包含 2 列和 x 行:
第一列包含一个布尔值,它自己的单元格渲染和单元格编辑器(一个单选按钮)
第二列包含一个字符串值,它自己的单元格渲染器:它在第一个当前行的列设置为 true(选中单选按钮)

编辑器正确更新了所有值,但是当单选按钮设置为 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();
}
}
4

3 回答 3

1

在您的表模型中,每当您的值发生变化时,您都必须触发适当的事件。如果您的模型是从您那里继承而来的AbstractTableModel,则可以使用多种fireXXX方法。我的猜测是你应该从setValueAt方法中调用它们。

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

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

于 2009-05-28T04:18:04.567 回答
0

延伸到那里似乎没有任何意义DeafultCellEditor。实现这样的监听器接口也不是一个好主意。

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

于 2009-05-27T18:47:22.897 回答
0

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

干杯


/**
 * 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);
}
于 2009-05-28T13:44:25.647 回答