CharmListView SelectedItemProperty?
CharmListView SelectedItemProperty?
我正在使用 CharmListView
,只是注意到它没有 ListView 所具有的 SelectionModel
。我曾经使用 listView.getSelectionModel().SelectedItemProperty().addListener()
来响应带有 ListView
的项目选择事件。 CharmListView?
是怎么做到的
编辑
应用流程说明如下:
用户选择学校的一个系。此列表位于 ListView
然后一个学期。另一个列表在 CharmListView
:
initialize
方法SemesterPresenter
class:
public void initialize(URL url, ResourceBundle rb) {
loadSemesters();
semesterListView.setItems(semesters);
semesterListView.setHeadersFunction(Level::getLevel);
MobileApplication.getInstance().getView().showingProperty().addListener((obs,ov,nv)->{
System.out.println(semesterListView.getChildrenUnmodifiable());
});
}
第一次调用 getChildrenUnmodifiable() returns 一个空数组。当使用 中的所有命题并返回空指针时,情况相同。
目前,内部 ListView
控件的几个属性尚未公开,例如 selectionModel 或 focusModel。这些可能在即将发布的版本中。
目前,作为解决方法,您可以查找它:
CharmListView<?, ?> charmListView = new CharmListView<>();
...
stage.show();
...
ListView innerList = (ListView)charmListView.lookup(".list-view");
innerList.getSelectionModel().selectedItemProperty().addListener(
(obs, ov, nv) -> System.out.println("Selected: " + nv));
issue 已提交此请求。
编辑
根据 OP 提供的新信息,CharmListView
初始化后,控件已创建,但尚未创建其皮肤,因此子项列表此时为空时刻.
添加 Platform.runLater();
只是延迟了该列表的检索,即控件完全创建皮肤所需的时间。
这应该有效:
@FXML
private CharmListView<String, String> charmListView;
@Override
public void initialize(URL url, ResourceBundle rb) {
charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test"));
Platform.runLater(() -> {
for (Node node : charmListView.getChildrenUnmodifiable()) {
if (node instanceof ListView) {
((ListView)node).getSelectionModel().selectedItemProperty().addListener(
(obs, ov, nv) -> System.out.println(nv));
}
}
});
}
此外,根据创建皮肤的想法,这也将起作用,为您提供创建 ListView
的确切时间:
@Override
public void initialize(URL url, ResourceBundle rb) {
charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test"));
charmListView.skinProperty().addListener((obs, ov, nv) -> {
for (Node node : charmListView.getChildrenUnmodifiable()) {
if (node instanceof ListView) {
((ListView)node).getSelectionModel().selectedItemProperty().addListener(
(obs2, ov2, nv2) -> System.out.println(nv2));
}
}
});
}
我正在使用 CharmListView
,只是注意到它没有 ListView 所具有的 SelectionModel
。我曾经使用 listView.getSelectionModel().SelectedItemProperty().addListener()
来响应带有 ListView
的项目选择事件。 CharmListView?
编辑
应用流程说明如下:
用户选择学校的一个系。此列表位于 ListView
然后一个学期。另一个列表在 CharmListView
:
initialize
方法SemesterPresenter
class:
public void initialize(URL url, ResourceBundle rb) {
loadSemesters();
semesterListView.setItems(semesters);
semesterListView.setHeadersFunction(Level::getLevel);
MobileApplication.getInstance().getView().showingProperty().addListener((obs,ov,nv)->{
System.out.println(semesterListView.getChildrenUnmodifiable());
});
}
第一次调用 getChildrenUnmodifiable() returns 一个空数组。当使用
目前,内部 ListView
控件的几个属性尚未公开,例如 selectionModel 或 focusModel。这些可能在即将发布的版本中。
目前,作为解决方法,您可以查找它:
CharmListView<?, ?> charmListView = new CharmListView<>();
...
stage.show();
...
ListView innerList = (ListView)charmListView.lookup(".list-view");
innerList.getSelectionModel().selectedItemProperty().addListener(
(obs, ov, nv) -> System.out.println("Selected: " + nv));
issue 已提交此请求。
编辑
根据 OP 提供的新信息,CharmListView
初始化后,控件已创建,但尚未创建其皮肤,因此子项列表此时为空时刻.
添加 Platform.runLater();
只是延迟了该列表的检索,即控件完全创建皮肤所需的时间。
这应该有效:
@FXML
private CharmListView<String, String> charmListView;
@Override
public void initialize(URL url, ResourceBundle rb) {
charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test"));
Platform.runLater(() -> {
for (Node node : charmListView.getChildrenUnmodifiable()) {
if (node instanceof ListView) {
((ListView)node).getSelectionModel().selectedItemProperty().addListener(
(obs, ov, nv) -> System.out.println(nv));
}
}
});
}
此外,根据创建皮肤的想法,这也将起作用,为您提供创建 ListView
的确切时间:
@Override
public void initialize(URL url, ResourceBundle rb) {
charmListView.setItems(FXCollections.observableArrayList("This", "is", "a", "test"));
charmListView.skinProperty().addListener((obs, ov, nv) -> {
for (Node node : charmListView.getChildrenUnmodifiable()) {
if (node instanceof ListView) {
((ListView)node).getSelectionModel().selectedItemProperty().addListener(
(obs2, ov2, nv2) -> System.out.println(nv2));
}
}
});
}