问题标签 [observablelist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 JavaFX 中使用 ObservableList 是否违反模型-视图-控制器分离?
我正在尝试研究 JavaFX,因为我想将它用作我的程序的 GUI。我的问题本质上是一个概念问题:
迄今为止,我的程序主要是 MVC 模式的“模型”部分;也就是说,我的几乎所有代码都是类意义上的抽象的面向对象表示,并且所有这些代码都是逻辑代码。
由于我不想成为我的程序的唯一用户,我想添加 MVC 的“视图”部分,以便人们可以轻松地使用和操作我的程序的“模型”部分。为此,我想使用 JavaFX。
在我的“模型”类中,我显然使用了 Java 集合 API 中的各种列表、地图和其他类。为了让我的程序的用户操作这些底层列表和地图,我想在 JavaFX 中使用 Observable(List/Map) 接口。
一个使情况更清晰的具体示例:
假设我有一个MachineMonitor类,它每 3 分钟检查一次机器的某些属性,例如连接是否仍然良好,齿轮转动的速度等。如果满足某些不等式(比如说齿轮已降至 1 转/秒的速率)MachineMonitor触发 RestartMachineEvent。
目前我使用 ArrayList< MachineMonitor > 来跟踪所有单个MachineMonitor的。现在扩展到 MVC 的“视图”部分,我希望用户能够操作显示 MachineMonitor 列表的 TableView,以便他们可以创建和删除新的MachineMonitor以监控各种机器。
这样我就可以跟踪我的程序的用户想要做什么(例如,为机器#5 创建一个MachineMonitor,检查齿轮的转数/秒是否低于 0.5)我使用 ObservableList< MachineMonitor > 作为TableView 的基础列表。
链接我的程序的“模型”和“视图”的最简单方法是将“模型”类更改为具有 ObservableList< MachineMonitor > 而不是 ArrayList< MachineMonitor > 但是(进入问题的主题)我觉得这很混乱,因为它混合了“模型”和“视图”代码。
一种天真的方法是对 TableView 使用 ObservableList< MachineMonitor > 并保留我的 ArrayList< MachineMonitor > 的使用。但是,根据 JavaFX 规范,对 ObservableList< MachineMonitor > 所做的更改不会影响基础列表。
鉴于此,解决这个难题的最佳方法是为 ObservableList< MachineMonitor > 创建一个 ChangeListener,它将对 ObservableList< MachineMonitor >所做的更改“传播”到底层“模型”ArrayList< MachineMonitor >?也许把它放在一个名为 MachineMonitorController 的类中?
这种临时解决方案似乎非常混乱且不理想。
我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?
java - ListView 未反映更改
不久前我创建了一个 TableView 并为每个 TableColumns 注册了属性。内部数据的编辑可以很好地反映在 TableView 中。
然而,对于 ListView,情况就不同了。除非我关闭框架并再次打开它,否则不会立即显示更改。
我的 ListView 由 ActionSteps 组成。请注意,我使用了 Javafx bean 属性。
我的 ListView 也使用 ObservableList。
为什么对 ObservableList 所做的更改不会反映在 ListView 中?我注意到 ListView 调用每个对象的 toString() 以在 ListView 中显示它们的值,而不是将其绑定到它们的属性。
我究竟做错了什么?我应该覆盖一个细胞工厂还是什么?
java - 如何从 ListChangeListener.Change 中知道哪些元素被删除了?
ObservableList
是按性质排序的,大多数访问和报告都是基于索引的。但突然间,在报告移除情况时,他们转而采用基于价值的方法。
为什么?
我有第二个列表,其中包含 ObservableList 的附加信息,并希望使其与 ObservableList 保持同步。我可以跟踪排列、更新和添加,但我无法跟踪删除。
为什么?
如何知道 ObservableList 中移除元素的索引?可能吗?
JavaFX 8 文档在这里:http ://docs.oracle.com/javase/8/javafx/api/javafx/collections/ListChangeListener.Change.html
更新
假设我有ObservableList
,它包含 5 个结果相同的值,例如字符串“person”、“person”、“person”、“person”、“person”。现在我删除了最后三个人。getRemoved()
如果只显示三个值,我怎么知道最后 3 个人被删除?
java - 将计算列添加到可观察列表
我对 java 和 JavaFX Scene Builder 还很陌生。很难从 Scene builder with Java 中找到有关如何链接/编码表单的教程。所以我最终对它提出了一个问题。
我有一个包含 2 列的可观察列表。A 列给我整数作为字符串 B 列另一个整数作为字符串 - 我现在如何计算列 C (A - B)?
到目前为止,我将代码设置如下:
主控制器类
表类
我是否需要为计算 rA - rB 的 c 设置另一个设置模式?
java - 遍历可观察列表
我有一个包含单列的 javafx 表(carTable):
此列是可观察列表 (carOL) 的一部分。此 OL 还包含 2 个列表(“日期”和“价格”)。可以从互联网上下载每个品牌的特定时间窗口的价格。
例如:
我现在想用所有这些数据创建一个折线图,比较不同品牌之间的价格变化。
到目前为止我想出了什么:
这当然不能完全返回我想要的。我不知何故需要能够为每个品牌创建单独的“系列”。
任何人都可以帮忙吗?
tableview - JavaFX:将按钮的禁用属性绑定到 ObservableList 大小
我有一个TableView
,我想将 a 的禁用属性与表模型的Button
大小绑定。特别是,当 的大小大于 2ObservableList
时,我想禁用该按钮。ObservableList
我怎样才能做到这一点?
在我使用的表中未选择任何行时禁用另一个按钮
有没有类似的方法?
java - 复制 ObservableList java
我有一个masterData
which 是 anObservableList
并且filteredData
which 也是一个ObservableList
.
然后,我想在设置过滤器时使用它来显示过滤后的数据,而且还能够在必要时恢复。这是MCVE:
我用来过滤数据的类过滤器:
还有Foo
类,它只是一个 [String]name
和一个 [int] bar
(加上 getter /setters)
当你运行这段代码时,你会得到:
啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
啊啊
当过滤器设置为 3(按预期过滤数据)和过滤器“重置”为零之后。
如何确保始终使用masterData中的数据处理过滤器,然后将其存储在过滤数据上?
注意:这是一个 JavaFX 项目,所以我真的需要使用ObservableList
.
binding - JavaFX 双向绑定两个不同的非字符串 ListProperty
我需要将两个 ListProperties 绑定在一起:
chartDataList
将用于显示 LineChart,而另一个 ( data
) 将用于我的程序的其余部分。chartDataProperty
不是真的需要(但用于绑定),因为LineChart
只使用chartDataList
.
注意:绑定需要是双向的,因为我可以LineChart
使用鼠标手动拖动点。
我没有找到直接的方法来处理这个;只有转换似乎是到/从String
(或ListProperty<String>
)。我可以将它与 man-in-the-middle 一起使用ListProperty<String>
,但它看起来效率很低。
否则我需要求助于ChangeListner
使用,手动处理所有可能的情况。
请告诉我我有更好的选择。
combobox - JavaFx 8:如果修改了 ComboBox 的当前选定项,则更新它
我有一个ComboBox
模型ObservableList<Item>
。我可以在外部更新列表的元素,并且我想更新当前选定的项目ComboBox
是否已被修改。我试着做:
我ChangeListener
在列表中添加了一个,因此当更新中的某些元素时list
,我可以更新comboBox
. 但这不起作用,因为comboBox.getSelectionModel().getSelectedIndex()
insideonChange
返回了我-1
,我不明白为什么(如果我从 onChange 中打印出值,例如第一个 System.out,则该值是正确的)。
你能解释一下这种行为吗?是否有更好的方法来实现我想要的?谢谢。
java - 将 TreeView 与多个嵌套的 ObservableLists 同步
我有 ObservableLists 的 ObservableLists 的 ObservableList...
它基本上下降了4个级别。
目标有一个列表
目标有一个列表
策略有一个列表
战术有一个列表
任务
显然,这看起来像是设置 TreeView 以显示此数据的完美场景。怎样才能使结构中所做的任何更改也显示在 TreeView 上?
我认为目标将是根节点。每当将一个目标添加到其列表中时,我们都可以监听它并提醒目标刚刚创建了一个目标。我应该如何以及在哪里设置这个监听器?我是否提醒目标?或者我是否提醒一些静态实用程序类来更新它的 TreeView?