首先,如果因为我对Java Swing知之甚少而无法以方便的方式表达我的问题,我会道歉。
我有一个4列的JTable。 JTable 单元格可编辑并保留AbstractTableModel。当第一个单元格进入编辑模式时,我想显示一个带有列表的对话框(我做得很好)。从列表中选择数据后,它返回一个对象(我可以访问该对象)。但是由于编辑器是JTextField,它将显示对象的一个子值(我也这样做了)。但是当单元格将其位置更改为另一个单元时,JTable会使用setValueAt方法将值放入表模型中。但这次它只返回编辑器保存的文本。实际上它应该返回一个Object来将对象放在表模型中。
我无法理解如何从TableCellEditor Class中保存对象并在JTable自动触发将单元格值放入表模型时将其传递给setValueAt?为了更好地理解,我在下面提到了我的代码。
public class myobject {
public String id;
public String name;
public String tag;
}
public class My_Table_Cell_Editor extends AbstractCellEditor implements TableCellEditor {
private myobject curr_val;
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
Component c = table.getEditorComponent();
if(c==null){
return null;
}
if(column == 0){
MyDialog dg = new MyDialog(null,true);
dg.setVisible(true);
if("OK".equals(dg.button_state)){
((JTextField)c).setText(dg.return_record.record_name);
curr_val = dg.return_record; // return_record is myobject
fireEditingStopped();
}
}
((JTextField)c).selectAll();
return c;
}
@Override
public Object getCellEditorValue() {
return curr_val;
}
}
public class myTableModel extends AbstractTableModel{
Other codes are as usual...
@Override
public void setValueAt(Object value, int row, int col) {
rec_model rec = rec_arr.get(row);
switch (col) {
case 0:
rec.myobj = (myobject) value;
break;
}
rec_arr.set(row, rec);
fireTableCellUpdated(row, col);
}
}
答案 0 :(得分:2)
如何从 TableCellEditor
类中保留对象,并在 {{1>时将其传递给 setValueAt()
自动触发将单元格值放到表模型中?
正如here所述,您不应该:“表格JTable
方法通过editingStopped()
收集新值,并将其用于模型中的getCellEditorValue()
。”您不需要setValueAt()
到TableCellEditor
。为了帮助理解,我发现在调试器中使用fireEditingStopped()
来检查调用堆栈是有帮助的。