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

时间:2016-02-23 13:02:52

标签: listview javafx properties changelistener

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

我已设法使用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时,此属性不会被更改,因为没有发生任何事情 - 所以实际上触发了itemsProperty ListView要改变,如果这种方法不起作用,有没有办法通过利用与ListView相关的另一个属性(当然以一种相当优雅的方式)来完成我对ListChangeListener的处理?

1 个答案:

答案 0 :(得分:4)

itemsProperty()是保存列表本身的属性;如果您致电listView.setItems(...),(如果列表参考本身已更改),将向其注册的听众会收到通知,但如果您修改其中包含的列表的内容,则不会收到通知(即如果你做listView.getItems().add(...))。

Bindings类提供了一个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) -> {
    // ...
});