我有一个TableView,其项目包含复选框。选择2个复选框后,我需要“取消隐藏”按钮。
我不知道如何检查。你有办法吗?
据我所知,你不能在这里使用绑定,因为你不能将自己绑定到多个属性。我很高兴得到各种帮助。 :)
编辑:为了澄清自己:tableView.getItems()。addListener()将不起作用,因为它只能侦听对列表的修改而不是外部元素。它可以注意到是否调用了“add()”或“remove”,但基本上就我所知道的那样。
PS:在单独的线程中忙着等待当然不是解决办法。
答案 0 :(得分:2)
假设某TableView<Item>
个班级Item
BooleanProperty
:
public class Item {
private final BooleanProperty checked = new SimpleBooleanProperty();
public BooleanProperty checkedProperty() {
return checked ;
}
public final boolean isChecked() {
return checkedProperty().get();
}
public final void setChecked(boolean checked) {
checkedProperty().set(checked);
}
// other properties, etc...
}
并且您的复选框已绑定到此属性,然后您可以使用提取器创建项目列表:
ObservableList<Item> items = FXCollections.observableArrayList(item ->
new Observable[] { item.checkedProperty() });
table.setItems(items);
这可确保当checkedProperty
对其任何元素进行更改时,列表会触发更新通知。
所以现在你可以做一些正常的绑定:
IntegerBinding numberChecked = Bindings.createIntegerBinding(() ->
(int) items.stream().filter(Item::isChecked).count(),
items);
button.visibleProperty().bind(numberChecked.greaterThanOrEqualTo(2));
如果你想要超级高效:
int requiredNumberChecked = 2 ;
button.visibleProperty().bind(Bindings.createBooleanBinding(() ->
items.stream()
.filter(Item::isSelected)
.skip(requiredNumberChecked-1)
.findAny().isPresent(),
items));
(一旦找到两个选中的项目,绑定就会返回true,而不是扫描整个列表。)