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

使用不同的更改侦听器评估ListView是否为空,listview,javafx,properties,changelistener,Listview,Javafx,Properties,Changelistener,我想评估ListView是否为空以禁用或启用提交按钮。因此,本质上,当ListView没有内容时,按钮被禁用,当它有一个或多个元素时,按钮被启用 我已经使用ListChangeListener实现了这一点,使用的代码如下: vp.addListChangeListener(change -> { change.next(); if (change.getList().size() == 0 && change.wasRemoved() |

我想评估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);
}
其中addItemsListener方法如下,并将侦听器附加到itemsProperty:

public void addItemsListener(ChangeListener<ObservableList<Name>> listener) {
        listView.itemsProperty().addListener(listener);
    }
但是,出于某种原因,当我向ListView添加项时,或者向附加到它的ObservableList添加项时,此属性没有更改,因为没有发生任何事情-那么,是什么实际触发ListView的itemsProperty更改,如果此方法不起作用,当然,有没有一种方法可以像我对ListChangeListener所做的那样,以一种相当优雅的方式使用与ListView关联的另一个属性?

itemsProperty是保存列表本身的属性;如果您调用listView.setItems…,即列表引用本身发生更改,则向其注册的侦听器将收到通知,但如果您修改其包含的列表的内容,即执行listView.getItems.add…,则不会收到通知

Bindings类提供了一种可在此处使用的方法:

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);
}
itemsProperty是保存列表本身的属性;如果您调用listView.setItems…,即列表引用本身发生更改,则向其注册的侦听器将收到通知,但如果您修改其包含的列表的内容,即执行listView.getItems.add…,则不会收到通知

Bindings类提供了一种可在此处使用的方法:

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”,你能给我更多细节吗?我有一个类似于你在这里描述的问题,但我不明白代码中什么代表“vp”,你能给我更多细节吗?