除非匿名内部类,否则ListView setCellFactory会搞砸绑定?

时间:2016-01-19 17:41:56

标签: java listview javafx custom-cell anonymous-inner-class

为什么我要求将JavaFX Callback实例传递给ListView::setCellFactory,以便与selectedItemPropertyListView::getSelectionModel)的绑定进行匿名子类化以实际获得通知当selectedItemProperty发生变化时?

好的,所以我克隆了james-d的嵌套控制器示例:https://github.com/james-d/Nested-Controller-Example

我想知道为什么在用这个最小代码替换MainController.java的{​​{1}}行时,与编辑器的绑定仍然有效(其中单元格为空但是绑定与编辑仍然有效)

personList.setCellFactory

但是,如果我删除了personList.setCellFactory(param -> new ListCell<Person>(){}); ,那么在选择那些“空白”时,文本字段就不再更新了。细胞

{}

我认为在使用自定义personList.setCellFactory(param -> new ListCell<Person>()); (每个ListCellFactory ListCell绑定并正确显示)时,同样的问题仍然存在,所以问题不然它位于实现本身(有点),而是传递给setCellFactory的回调参数是如何实例化的,显然必须是绑定的匿名子类,selectedItemProperty才能按预期工作(以及谁知道其他可能会受到影响)

不工作

textProperty

WORKS

personList.setCellFactory(new PersonListCellFactory());

有人可以重现这个问题吗?

在工厂的情况下,personList.setCellFactory(new PersonListCellFactory(){}); 绑定已实现,所以不是这样,但无论如何都是textProperty的代码:

PersonListCellFactory

那怎么可能呢?

1 个答案:

答案 0 :(得分:0)

您提供的单元格工厂在单元格显示的当前项目的nameProperty与单元格文本之间建立绑定。这意味着当项目名称更改时,将通知单元格并更新其文本。

如果没有此绑定,即使编辑器中的文本字段仍绑定到项目中的属性,如果属性发生更改,单元格也不会知道更新。因此,简而言之,编辑器和列表项之间的绑定仍然有效,但是列表项中没有通知显示文本的单元格。

如果使用动作处理程序向UI添加按钮

myItemList.getItems().forEach(System.out::println);

您将看到更改文本字段中的文本会更新基础模型,只是单元格尚未更新。

您可以使用带有提取器的列表来解决此问题:另请参阅Java ListChangeListener WasUpdated() doesn't work。这使列表能够在模型类的某些属性发生更改时触发更新通知(列表视图可以看到,因此它会更新相关单元格)。在你的情况下,你需要

public void initialize() {
    myItemList.setItems(FXCollections.observableArrayList(item -> 
        new Observable[]{item.nameProperty()}));
    myItemList.getItems().addAll(sampleMyItems());

    myItemEditorController.myItemProperty().bind(myItemList.getSelectionModel().selectedItemProperty());
}