【问题标题】:JavaFX ReadOnlyListProperty not read only?JavaFX ReadOnlyListProperty 不是只读的?
【发布时间】:2013-09-03 15:05:47
【问题描述】:

此代码引发 UnsupportedOperationException,因为它是只读的。

ListProperty<String> lp = new SimpleListProperty<String>();
ReadOnlyListWrapper<String> rolw = new ReadOnlyListWrapper<String>(lp);
ReadOnlyListProperty<String> rolp = rolw.getReadOnlyProperty();
rolp.add("element");

但是,这段代码没有。

ObservableList<String> ol = FXCollections.observableArrayList();
ReadOnlyListWrapper<String> rolw = new ReadOnlyListWrapper<String>(ol);
ReadOnlyListProperty<String> rolp = rolw.getReadOnlyProperty();
rolp.add("element");

这是一个错误,还是我只是不明白什么?

【问题讨论】:

    标签: javafx


    【解决方案1】:

    最初的期望是错误的 - 对于提供的示例。 UnsupportedOperationException 发生的原因不同,而不是因为正在“写入”“只读”列表。仍然可以有“只读”列表。我希望下面的答案有助于澄清。

    答案需要分两部分来考虑。一:ListProperty 异常,二:只读列表。

    1) ListProperty 示例失败,因为没有将列表分配给该属性。

    这个简化的例子也会引发异常。请注意,所有“只读”方面都已删除:

    ListProperty<String> lp = new SimpleListProperty<>();
    lp.add("element");
    

    这可以通过以下方式纠正:

    ObservableList ol = FXCollections.observableArrayList();
    ListProperty<String> lp = new SimpleListProperty<>();
    lp.setValue(ol);
    lp.add("element");
    

    如果我们以类似的方式更改原始示例,那么 ListProperty 和 ObservableList 示例都不会抛出异常,这不是 OP 想要或期望的。

    2) 第二部分询问为什么可以将元素添加到只读列表中。使用 FXCollections.unmodifiableObservableList 创建只读列表会按预期抛出 UnsupportedOperationException:

    ObservableList<String> ol = FXCollections.observableArrayList();
    ObservableList<String> uol = FXCollections.unmodifiableObservableList(ol);
    uol.add("element");
    

    但这并不能回答为什么 ReadOnlyListWrapper/Property 不这样做?

    让我们首先处理属性。 ListProperty 允许更改 value,即它允许您为属性分配不同的列表。 ReadOnlyListProperty 不允许这样做,即一旦分配了列表,它仍然是该列表对象。列表的内容仍然可以更改。下面的示例对 ReadOnlyListProperty 没有意义:

    ObservableList<String> ol1 = FXCollections.observableArrayList();
    ObservableList<String> ol2 = FXCollections.observableArrayList();
    ListProperty<String> lp = new SimpleListProperty<>(ol1);
    lp.setValue(ol2);
    

    所以只读是指属性,而不是列表。

    最后 - ReadOnlyListWrapper - 正如 API 文档所述,“此类提供了一个方便的类来定义只读属性。它创建了两个同步的属性。一个属性是只读的,可以传递给外部用户。另一个属性是可读写的,只能在内部使用。”

    【讨论】:

    • 感谢您的详细回复。自从我发布此内容以来,我一直在 FX 上花费更多时间,并开始了解您发布的内容。文档仍然有点薄,但正如您指出的那样,通过阅读 API 文档,我至少可以找到部分答案。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多