Javafx 如何侦听tableview中的内部更改?

Javafx 如何侦听tableview中的内部更改?,javafx,tableview,javafx-8,observablelist,Javafx,Tableview,Javafx 8,Observablelist,我有一个TableView,它的项包含复选框。一旦选中两个复选框,我需要“取消隐藏”一个按钮 我不知道怎么检查。你有办法吗 这些物品彼此不认识 TableView控制器保存TableView和TableColumns 据我所知,您不能在这里使用绑定,因为您不能将自己绑定到多个属性。我为每一种帮助感到高兴。:) 编辑:澄清我自己:tableView.getItems().addListener()不起作用,因为它只能侦听对列表的修改,而不能侦听外部元素。它可以注意到是否调用了“add()”或“

我有一个TableView,它的项包含复选框。一旦选中两个复选框,我需要“取消隐藏”一个按钮

我不知道怎么检查。你有办法吗

  • 这些物品彼此不认识
  • TableView控制器保存TableView和TableColumns
据我所知,您不能在这里使用绑定,因为您不能将自己绑定到多个属性。我为每一种帮助感到高兴。:)

编辑:澄清我自己:tableView.getItems().addListener()不起作用,因为它只能侦听对列表的修改,而不能侦听外部元素。它可以注意到是否调用了“add()”或“remove”,但据我所知基本上就是这样


PS:在一个单独的线程中忙着等待当然不是解决方案。

假设您有一个
表视图
,用于一些
类和
布尔属性

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);
如果您想变得超级高效:

int requiredNumberChecked = 2 ;
button.visibleProperty().bind(Bindings.createBooleanBinding(() ->
    items.stream()
        .filter(Item::isSelected)
        .skip(requiredNumberChecked-1)
        .findAny().isPresent(), 
    items));

(只要找到两个选中的项,绑定就会返回true,而不是扫描整个列表)。

假设您有一个
表视图
用于某些
类,该类具有
布尔属性

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);
如果您想变得超级高效:

int requiredNumberChecked = 2 ;
button.visibleProperty().bind(Bindings.createBooleanBinding(() ->
    items.stream()
        .filter(Item::isSelected)
        .skip(requiredNumberChecked-1)
        .findAny().isPresent(), 
    items));

(只要找到两个选中的项目,绑定就会返回true,而不是扫描整个列表)。

您的复选框绑定到您的项目的某些
BooleanProperty
?您的复选框绑定到您的项目的某些
BooleanProperty
?这看起来像是一个高级版本,谢谢。但我不理解“新可观察[]”部分。在我的理解中,这创建了一个不应该放在“ObservableList”中的可观察对象,可能只是为了“ObservableList”和“extractor”。这看起来像是一个豪华版本,谢谢。但我不理解“new Observable[]”部分。在我的理解中,这创建了一个不应该放在“ObservableList”中的可观察对象ObservableList,也许只是“ObservableList”和“extractor”。