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) -> {
// ...
});
我想评估 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) -> {
// ...
});