1

首先,如果由于我对 Java Swing 的了解很少而无法以方便的方式表达我的问题,我深表歉意。

我有一个有 4 列的 JTable。JTable单元格是可编辑的并拥有一个 AbstractTableModel。当第一个单元格要进入编辑模式时,我想显示一个带有列表的对话框(我做得很好)。从列表中选择数据后,它返回一个对象(我可以访问该对象)。但是作为一个编辑器是 JTextField 它将显示来自对象的一个​​子值(我也这样做过)。但是当单元格将其位置更改为另一个单元格时,JTable 使用 setValueAt 方法将值放入表模型中。但这次它只返回编辑器保存的文本。实际上,它应该返回一个 Object 以将对象放入表模型中。

当 JTable 自动触发将单元格值放入表格模型时,我无法理解如何从 TableCellEditor 类中保存对象并将其传递给 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);
    }
}
4

1 回答 1

2

如何从 TableCellEditor 类中保存对象并将其传递给 setValueAt() 何时 JTable 自动触发以将单元格值放入表模型?

正如这里所讨论的,您不应该:“表格的editingStopped()方法通过收集新值getCellEditorValue()并将其用于setValueAt()模型中。” 你不需要TableCellEditorto fireEditingStopped()editingStopped()为了帮助理解,我发现在调试器中继续检查调用堆栈很有帮助。

于 2013-08-12T19:43:07.830 回答