FX оценивает, пуст ли ListView, используя разные прослушиватели изменений

Я хочу оценить, пуст ли 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, это свойство не изменяется, так как ничего не происходит - так что же на самом деле вызывает изменение itemsProperty ListView , и если этот подход не сработает, есть ли способ сделать то, что я сделал с ListChangeListener, используя другое свойство, связанное с ListView (конечно, достаточно элегантным способом)?


person Tranquility    schedule 23.02.2016    source источник


Ответы (1)


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) -> {
    // ...
});
person James_D    schedule 23.02.2016
comment
У меня похожая проблема, которую вы описываете здесь, но я не понимаю, что представляет собой «vp» в коде, можете ли вы дать мне более подробную информацию? - person Fernando CT; 07.07.2018