我想评估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的处理?
答案 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) -> {
// ...
});