如何收听表视图中的内部更改?
How can I listen to INTERNAL changes in a tableview?
我有一个 TableView,其项目包含复选框。选中 2 个复选框后,我需要 "unhide" 一个按钮。
我不知道如何检查。你有办法吗?
- 项目互不认识。
- TableView-Controller 包含 TableView 和 TableColumns。
据我所知,您不能在此处使用绑定,因为您不能将自己绑定到多个属性。我很高兴能得到各种帮助。 :)
编辑: 澄清一下:tableView.getItems().addListener() 将不起作用,因为这只能听取对列表的修改,而不是对外部元素。它可以注意到是否调用了 "add()" 或 "remove",但据我所知基本上就是这样。
PS: 在单独的线程中忙等待当然不是解决方案。
假设你有一个 TableView<Item>
对于一些 Item
class 和 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));
如果你想成为super-efficient:
int requiredNumberChecked = 2 ;
button.visibleProperty().bind(Bindings.createBooleanBinding(() ->
items.stream()
.filter(Item::isSelected)
.skip(requiredNumberChecked-1)
.findAny().isPresent(),
items));
(绑定将 return 找到两个选中的项目后立即为真,而不是扫描整个列表)。
我有一个 TableView,其项目包含复选框。选中 2 个复选框后,我需要 "unhide" 一个按钮。
我不知道如何检查。你有办法吗?
- 项目互不认识。
- TableView-Controller 包含 TableView 和 TableColumns。
据我所知,您不能在此处使用绑定,因为您不能将自己绑定到多个属性。我很高兴能得到各种帮助。 :)
编辑: 澄清一下:tableView.getItems().addListener() 将不起作用,因为这只能听取对列表的修改,而不是对外部元素。它可以注意到是否调用了 "add()" 或 "remove",但据我所知基本上就是这样。
PS: 在单独的线程中忙等待当然不是解决方案。
假设你有一个 TableView<Item>
对于一些 Item
class 和 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));
如果你想成为super-efficient:
int requiredNumberChecked = 2 ;
button.visibleProperty().bind(Bindings.createBooleanBinding(() ->
items.stream()
.filter(Item::isSelected)
.skip(requiredNumberChecked-1)
.findAny().isPresent(),
items));
(绑定将 return 找到两个选中的项目后立即为真,而不是扫描整个列表)。