1

我正在使用CharmListView,只是注意到它没有SelectionModelListView 所具有的。我曾经使用listView.getSelectionModel().SelectedItemProperty().addListener(). 来响应项目选择事件ListView。这是如何完成的CharmListView?

编辑

应用流程解释如下:

用户选择学校的部门。该列表位于ListView

在此处输入图像描述

然后一个学期。另一个列表位于CharmListView

在此处输入图像描述

类的initialize方法SemesterPresenter

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() 返回一个空数组。使用以下帖子中的所有命题并返回空指针时,情况相同。

4

1 回答 1

1

目前内部控件的几个属性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));
            }
        }
    });
}
于 2015-12-10T09:06:23.993 回答