gpt4 book ai didi

JavaFX ReadOnlyListProperty 不是只读的吗?

转载 作者:行者123 更新时间:2023-12-04 17:35:59 28 4
gpt4 key购买 nike

此代码抛出 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");

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

最佳答案

最初的期望是错误的 - 对于提供的示例。 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 不这样做的问题?

让我们先处理属性(property)。 ListProperty 允许更改值,即它允许您为属性分配不同的列表。 ReadOnlyListProperty 不允许这样做,即一旦分配了列表,它仍然是该列表对象。列表的内容仍然可以改变。下面的示例对 ReadOnlyListProperty 没有意义:
ObservableList<String> ol1 = FXCollections.observableArrayList();
ObservableList<String> ol2 = FXCollections.observableArrayList();
ListProperty<String> lp = new SimpleListProperty<>(ol1);
lp.setValue(ol2);

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

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

关于JavaFX ReadOnlyListProperty 不是只读的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595631/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com