JavaFX ReadOnlyListProperty 不是只读的?

2024-05-17

这段代码抛出 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.unmodifyingObservableList 创建只读列表将按预期抛出 UnsupportedOperationException:

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

但这并没有回答为什么 ReadOnlyListWrapper/Property 不这样做的问题?

我们先来处理一下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 文档所述“此类提供了一个方便的类来定义只读属性。它创建两个同步的属性。一个属性是只读的,可以传递给外部用户。另一个属性是读取的- 并且可写,并且只能在内部使用。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX ReadOnlyListProperty 不是只读的? 的相关文章

  • JavaFX ProgressBar:如何添加动画?

    我创建了一个进度条并更改了进度条颜色 是否可以像 bootstrap 动画进度条一样向进度条添加动画 这是示例 链接在这里 http getbootstrap com components progress animated 实际上 我找到
  • 尝试使 Tableview 可点击时发生 JavaFX 错误

    我正在尝试使表格视图可单击 它将返回单击的单元格中的文本 尝试在 Netbeans 中编译时收到两个错误 所有代码均取自 示例12 11 单元格编辑的替代解决方案 官方表格视图教程 http docs oracle com javafx 2
  • 学习 Java Native Access 时出现 com.sun.glass.ui 包错误

    我正在尝试在 JavaFX 项目中使用 Undecorated 阶段 stage initStyle StageStyle UNDECORATED 它是一个模块化的 Gradle 项目 它也是一个多项目构建 https guides gra
  • JavaFX 自定义列表单元格,updateItem 被多次调用

    我正在使用一个ListView在 JavaFX 应用程序中 列表中的项目需要的不仅仅是一个字符串来显示它们 所以我做了一个自定义实现ListCell
  • JavaFX TabPane - 每个选项卡一个控制器

    我是 Fx 新手 我有一个带有 10 个选项卡的 TabPanel 每个选项卡都有很多控件 图表 按钮等 我想要的是为每个选项卡分配一个控制器 SceneBuilder 只让我为整个视图分配一个控制器 我的意思是 只有顶部面板 根 具有 控
  • 在 CSS 中设置 TableView 样式 (JavaFX)

    如何在 TableView 中设置 THIS 点的样式 我的 CSS 代码如下所示 Empty Stylesheet file root fx background color 262626 table view fx background
  • 如何在JavaFX中获得一个小的ProgressBar

    我正在尝试获得一个类似 iTunes 的进度条 该进度条非常小 高度约为 5 像素 但我似乎无法低于 19 或 20 像素 我尝试在周围的窗格上设置 fx max height 但没有效果 请注意 这个值确实会改变高度 我只是不能让它小于大
  • 如何使用 javafx 创建响应式文本?

    我创建了一个标签 其中显示了一个数字 现在我想让这个数字响应 GUI 我怎样才能做到这一点 这是我的号码及其当前字体大小 Label label new Label label setText 12 label setFont Font f
  • 在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件

    我想在可执行 jar 文件中创建自定义控件 然后在 Gluon Scene Builder 11 00 中使用 我需要知道如何做到这一点 我尝试了几种形式 但在场景生成器中导入 jar 时我的控件没有出现 我正在使用 IntelliJ Co
  • IntelliJ 不会从 Maven 依赖项加载 javafx 包 (JavaFX 17)

    我正在尝试获取一个 Maven JavaFX 项目 该项目是从javafx 原型 fxml原型且未经编辑 可在最新版本的 IntelliJ 中运行 需要明确的是 该项目是该原型的直接复制 我只是想让一个例子起作用 可以说我是 Maven 的
  • 如何根据 JavaFX 8 中的特定祖先获取节点边界?

    我在 AnchorPane 中添加了一个图表 我想获取其绘图的范围 图表 我用青色标记 这样我就可以在它上面添加一些文本 但我应该根据它的祖先知道它的确切边界 如果我手动执行此操作 则在调整大小等时更改节点的填充大小时 我可能会失败 imp
  • 在 JavaFX 中搜索 TableView 列表

    如何在 TableWie 中查找记录 例如通过 ID 并选择创建的行并将其放在 Java 8 JavaFX 中的屏幕中间 您可以使用以下方式搜索元素 int searchId table getItems stream filter ite
  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • Javafx 组合框不会在实时更改时更新下拉列表大小?

    我正在使用 Javafx v8 0 25 b18 我出现的问题是动态组合框的下拉列表的大小不会改变 所以如果我最初在下拉列表中有两个项目 那么下拉列表大小将适合两个项目 但如果我现在用以下内容填充动态组合框三个项目 然后我在里面得到一个小滚
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 错误:缺少 JavaFX 运行时组件,并且需要使用 Gradle 示例来运行此应用程序

    我知道这个问题已被问过多次 但我似乎找不到解决方案 摘自官方指南示例 https openjfx io openjfx docs gradle https openjfx io openjfx docs gradle我继续添加了我的构建 g
  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • JavaFX ScrollPane 样式

    我正在尝试在 JavaFX 中创建一个黑白 ScrollPane 我已经创建了一个 CSS 文件 它工作得很好 除了这个小方块 无论我尝试什么 我都无法将其变黑 这是我的 CSS 文件 scroll pane fx background c
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml

随机推荐