目前内部控件的几个属性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));
此请求已提交问题。
编辑
根据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));
}
}
});
}