为什么我要求将JavaFX Callback实例传递给ListView::setCellFactory
,以便与selectedItemProperty
(ListView::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
那怎么可能呢?
答案 0 :(得分:0)
您提供的单元格工厂在单元格显示的当前项目的nameProperty
与单元格文本之间建立绑定。这意味着当项目名称更改时,将通知单元格并更新其文本。
如果没有此绑定,即使编辑器中的文本字段仍绑定到项目中的属性,如果属性发生更改,单元格也不会知道更新。因此,简而言之,编辑器和列表项之间的绑定仍然有效,但是列表项中没有通知显示文本的单元格。
如果使用动作处理程序
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());
}