如何将对象从表格单元格编辑器传递到表格模型?

时间:2013-08-12 18:37:52

标签: java swing jtable tablecelleditor

首先,如果因为我对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);
    }
}

1 个答案:

答案 0 :(得分:2)

如何从 TableCellEditor 类中保留对象,并在 {{1>时将其传递给 setValueAt() 自动触发将单元格值放到表模型中?

正如here所述,您不应该:“表格JTable方法通过editingStopped()收集新值,并将其用于模型中的getCellEditorValue()。”您不需要setValueAt()TableCellEditor。为了帮助理解,我发现在调试器中使用fireEditingStopped()来检查调用堆栈是有帮助的。