【问题标题】:How to pass object from table cell editor to Table Model?如何将对象从表格单元格编辑器传递到表格模型?
【发布时间】:2013-08-14 04:37:12
【问题描述】:

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

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

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

【问题讨论】:

  • (不是攻击)你了解JTable的渲染器和编辑器概念吗(事件JTree,JComboBox),如果有真正的MyDialog dg = new MyDialog(null,true);,那么你可以传递值直接到XxxTableModel,那么Editor就没什么用了
  • @mKorbel:感谢您的评论。也许我会按照你的建议跳过上面提到的过程来获取第 0 列的编辑器值。对于列选择,我可以从对话框中获取值并轻松地将值设置为 TableModel。哪个更容易。

标签: java swing jtable tablecelleditor


【解决方案1】:

我怎样才能从 TableCellEditor 类中保存对象并将其传递给 setValueAt() JTable 自动触发将单元格值放入表格模型?

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

【讨论】:

  • 感谢您的回答。实际上我发现我的editingStopped()方法在fireEditingStopped()方法时没有被JTable调用,发现fireEditingStopped没用。虽然我无法解决问题但尝试找到任何解决方案。
  • 您可以编辑您的问题以阐明目标,而不是仅仅显示什么不起作用; sscce 表明您应用了 TableCellEditor 会更容易检查。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多