FX 使用不同的更改侦听器评估 ListView 是否为空

FX assessing if ListView is empty using different change listeners

我想评估 ListView 是否为空以禁用或启用提交按钮。所以本质上,当 ListView 没有内容时,按钮被禁用,当它有 1 个或多个元素时,它被启用。

我已经使用 ListChangeListener 实现了这一点,代码如下:

vp.addListChangeListener(change -> {
        change.next(); 

        if (change.getList().size() == 0 && change.wasRemoved() || change.getList().size() == 1 && change.wasAdded()) {
            bp.toggleSubmitAvailability("submit");
        }
    });

其中方法addListChangeListener如下:

public void addListChangeListener(ListChangeListener<Name> listener) {
    names.addListener(listener);
}

理想情况下,我只想使用传统的 ChangeListener 并监听与 ListView 关联的属性之一。例如,我认为这可能有效:

vp.addItemsListener((observable, oldValue, newValue) -> {

        if (newValue.size() == 0 && oldValue.size() > 0 || newValue.size() == 1 && oldValue.size() == 0) {
            bp.toggleSubmitAvailability("submit");
        }
    });

方法 addItemsListener 如下(并将侦听器附加到 itemsProperty):

public void addItemsListener(ChangeListener<ObservableList<Name>> listener) {
        listView.itemsProperty().addListener(listener);
    }

但是,由于某种原因,当我将项目添加到我的 ListView 时,或者将项目添加到附加到它的 ObservableList 时,这个 属性 没有被更改,因为什么都没有发生 - 那又怎样实际上会触发 ListView 的 itemsProperty 发生变化,如果这种方法不起作用,有没有办法通过利用与 ListView 关联的另一个 属性 来完成我对 ListChangeListener 所做的事情(当然是以一种相当优雅的方式)?

itemsProperty() 是保存列表本身的 属性;如果您调用 listView.setItems(...),用它注册的听众将收到通知(即,如果列表引用本身发生更改),但如果您修改列表的 content,则不会收到通知包含(即如果你这样做 listView.getItems().add(...))。

Bindings class 提供了一个 isEmpty(ObservableList) 方法,您可以在这里使用:

button.disableProperty().bind(Bindings.isEmpty(listView.getItems()));

或等效地,有一个监听器:

Bindings.isEmpty(listView.getItems()).addListener(
    (obs, wasEmpty, isNowEmpty) -> button.setDisable(isNowEmpty));

所以你可以实现这样的方法:

public void addEmptyListListener(ChangeListener<Boolean> listener) {
    Bindings.isEmpty(listView.getItems()).addListener(listener);
}

然后做

vp.addEmptyListListener((obs, wasEmpty, isNowEmpty) -> {
    // ...
});