如何将值绑定到ObservableList的大小?

9

我希望将一个值绑定到ObservableList的大小,以知道其大小,并了解它是否具有多个值

private ObservableList<String> strings = FXCollections.observableArrayList();
2个回答

26

它们可以使用 Bindings 类来绑定:

ObservableList<String> strings = FXCollections.observableArrayList();
IntegerBinding sizeProperty = Bindings.size(strings);
BooleanBinding multipleElemsProperty = new BooleanBinding() {
    @Override protected boolean computeValue() {
        return strings.size() > 1;
    }
};

12

采纳的答案是正确的。我会提供额外的见解,以便对感兴趣的读者有所裨益。

ObservableList是一个接口,并且没有size属性。ListExpression是实现了ObservableList并添加了ReadOnlyIntegerProperty sizeReadOnlyBooleanProperty empty属性的抽象类。这个类是整个列表属性类继承树的基类。

大多数用户不会想要自己子类化树中的抽象类,因此我们将查看提供的具体实现:

ListExpression                    (abstract)
 - ReadOnlyListProperty           (abstract)
    - ListProperty                (abstract)
      - ListPropertyBase          (abstract)
        - SimpleListProperty
          - ReadOnlyListWrapper

SimpleListProperty是一个简单的列表属性 - 一个被包装在Property中的ObservableList。它是其他SimpleXxxProperty的并列属性。它还有一个子类ReadOnlyListWrapper来处理只读和读写要求。它可以从ObservableList构造:

SimpleListProperty<String> list = new SimpleListProperty<>(FXCollections.observableArrayList());
IntegerProperty intProperty = new SimpleIntegerProperty();
intProperty.bind(list.sizeProperty());

需要从这个类中获益(而不只是使用 ObservableList)并决定使用它的用户不需要静态 Bindings#size 方法。


1
太棒了!这是我第一次看到ListExpression https://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/ListExpression.html - GOXR3PLUS
@GOXR3PLUS,你可能永远不会在代码中看到ListExpression,因为它非常低级且很少有人需要直接使用它。另一方面,SimpleListPropertyReadOnlyListWrapper则是开箱即用的非常有用的工具。 - user1803551
已经将其添加到代码中 :)。我需要将滚动条的最大值绑定到Observable List - 1的大小。 - GOXR3PLUS
1
@GOXR3PLUS,对于这个问题,SimpleListProperty已经足够了。 - user1803551

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接