【问题标题】:How can I listen to INTERNAL changes in a tableview?如何在 tableview 中收听 INTERNAL 更改?
【发布时间】:2016-01-18 15:02:31
【问题描述】:

我有一个 TableView,其项目包含复选框。选中 2 个复选框后,我需要“取消隐藏”一个按钮。

我不知道如何检查。你有办法吗?

  • 这些项目彼此不认识。
  • TableView-Controller 包含 TableView 和 TableColumns。

据我所知,您不能在这里使用绑定,因为您不能将自己绑定到多个属性。我很高兴得到各种帮助。 :)

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

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

【问题讨论】:

  • 您的复选框已绑定到您的某些 BooleanProperty 项目?

标签: javafx tableview javafx-8 observablelist


【解决方案1】:

假设您有一个 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,而不是扫描整个列表)。

【讨论】:

  • 这看起来像豪华版,谢谢。我不明白“新的 Observable []”部分。据我了解,这会创建一个不适合“ObservableList
  • Javadocs,也许只是search this site 用于“ObservableList”和“extractor”。
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2013-02-14
  • 2022-07-05
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多