2016-11-12 55 views
1

我有一个javafx应用程序TableView。只有第一列(dataTypeColumn)是可编辑的,并且它包含用于编辑的ComboBox。现在TableView做它应该做的事情,但是当我开始编辑一个单元格然后在不提交编辑的情况下将它滚动出视图时,会出现一些奇怪的错误。我非常确定这是因为TableView重用了单元格的方式。但是我还没有找到任何干预它的方法,例如为了禁止重用当前正在编辑的单元格。你能帮我解决吗?JavaFX Table view Cell Reuse

即使我敢肯定这是因为小区重用的,我会写整个问题的下方,在情况下,问题的来源是不同的。

有问题的列包含枚举值DataType 我该列看起来像这样的电池工厂:

dataTypeColumn.setCellFactory(param -> new ComboBoxTableCell<>(DataType.values())); 

列的值,得到这样写的:

dataTypeColumn.setCellValueFactory(param -> Bindings.valueAt(configuration, param.getValue())); 

在情况下,这是混乱的,我给物品我TableViewIntegers(从0到n-1),并在不同的列CellValueFactories的实际值将依赖于加载与当前栏目相关的。

所以编辑它时,它会显示一个ComboBox,其中DataType可以具有的所有值,让我们用户选择一个值。我对列回调反应编辑COMMITED事件,看起来像这样:

public void editCommited(TableColumn.CellEditEvent<Integer, DataType> event) { 
     //configuration is an ObservableList containing DataType elements 
     configuration.set(event.getRowValue(), event.getNewValue()); 
    } 

所以有关出现的问题。在开始时,该列中的所有单元格都具有相同的值:“未选中”。这是为这种情况保留的枚举的特殊值,因为我在ComboBoxTableCell类中找不到setPlaceholder函数。当我知道开始编辑其中一个单元格然后将其从视图中移出时,下一行中的其中一行也将突然处于编辑状态,即使该行之前未被触摸过。如果我进一步滚动,编辑状态下的单元格会在每次前一个滚动出视图时出现。我也可以返回并在编辑状态下找到相同的单元格。如果我编辑不应处于编辑状态的单元格,它将不会更改,但是我最初尝试编辑的单元格将更改其值。这可能是由于底层的ObservableList,它自动更新列中的值。

如果我开始编辑具有不同的值(从以前的编辑)的小区,一些更奇怪的情况发生。当再次滚动视图时,新行将在编辑页面中有一个单元格,但默认值为“未选中”。如果向后滚动,我试图编辑的单元格最初将不再处于编辑状态,但它的值已更改为“未选中”。仿佛获得编辑状态的新单元格提交了自己的价值。

请一些帮助,这:)

回答

2

这确实似乎是一个错误。相当令人惊讶的是,如果您使用鼠标移动滚动条,则编辑将被正确取消,但如果您使用鼠标滚轮进行滚动,则不会。

您可以轻松地创建此BUF一种解决方法,但是由于你只需要取消编辑,该项目被更换时。你可以例如使用此方法自行创建cellFactory

public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> comboBoxCellFactory(ObservableList<T> items) { 
    if (items == null) { 
     throw new IllegalArgumentException(); 
    } 
    return column -> new ComboBoxTableCell<S, T>(items) { 

     @Override 
     public void updateIndex(int i) { 
      cancelEdit(); 
      super.updateIndex(i); 
     } 

    }; 
} 
+0

不错,updateIndex是我正在搜索的函数。甚至覆盖了eventdispatcher来检查我是否可以对xD的重用做出反应。感谢您的快速回答:) – findusl