【问题标题】:Swing: Multiple CellEditors for a columnSwing:一列的多个单元格编辑器
【发布时间】:2010-04-09 00:29:37
【问题描述】:

在我的 JTable 中,我有两个可编辑的数字列。两列的编辑器都扩展了 AbstractCellEditor 并使用 JFormattedTextField 作为编辑组件。

问题在于输入的格式取决于行中另一列的值。如果满足条件 X,则小数位数应为 Y,否则应为 Y+2。

我试图覆盖 getTableCellEditor(..) 方法以关联每行的 TableCellEditor。见this example。但是,由于我有两个可编辑的列,因此每行共享一个 TableCellEditor 对象会产生一些非常奇怪的结果。我认为这不是一个合适的解决方案。

任何关于如何解决这个问题的想法将不胜感激!

谢谢!

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    我认为您不需要为每行关联一个 TableCellEditor。

    您只需要一个,它将自己访问其他数据。在 getTableCellEditor() 中,您可以访问表格以及坐标(列、行)。

    有了这个,你可以直接向表格询问它在想要的列的值,对于当前行。

    请记住,与渲染器一样,单元格编辑器是“共享的”。您确实要求同一个对象为您提供编辑器组件(例如,TableCellEditor 本身,扩展了 JFormattedTextField)。所以你不需要每行放一个,方法getTableCellEditor()将被调用,带有当前的列和行索引,你将根据条件提供具有适当格式的组件..

    类似这样的:

    public Component getTableCellEditorComponent(JTable table,
                                                 Object value,
                                                 boolean isSelected,
                                                 int row,
                                                 int column)
    {
        Object data = table.getValueAt(row, CONDITION_COLUMN);
        if (data is something)
            this.setFormat(FORMAT1);
        else
            this.setFormat(FORMAT2);
    
        return this;
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过创建另一个 TableCellEditor 来解决这个问题,它将委托给它的两个分包商之一:您当前的单元格编辑器的实例。您需要将这个 uber-celleditor 注册到该列,并让它在 Swing 使用它时委托。

      【讨论】:

      • Itay - 谢谢。这是我使用的方法,效果很好。
      【解决方案3】:

      我会覆盖 JTable 的 getCellEditor(...) 方法。然后就可以根据数据的格式返回相应的编辑器了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多