Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:一个列的多个单元格编辑器_Java_Swing_Jtable - Fatal编程技术网

Java Swing:一个列的多个单元格编辑器

Java Swing:一个列的多个单元格编辑器,java,swing,jtable,Java,Swing,Jtable,在我的JTable中,有两个可编辑的数字列。这两列的编辑器都扩展了AbstractCellEditor,并使用JFormattedTextField作为编辑组件 问题是输入的格式取决于行中另一列的值。如果满足条件X,分数位数应为Y,否则应为Y+2 我试图重写getTableCellEditor(..)方法,以便每行关联一个TableCellEditor。看见但是,由于我有两个可编辑列,因此每行共享一个TableCellEditor对象会产生一些非常奇怪的结果。我认为这不是一个合适的解决方案 任何

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

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

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

任何关于如何实现这一点的想法都将不胜感激


谢谢大家!

我认为您不需要每行关联一个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;
}

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

我将重写JTable的getCellEditor(…)方法。然后,您可以根据数据的格式返回相应的编辑器。

Itay-谢谢。这是我使用的方法,效果很好。