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