
在 JavaFX 图形可视化应用中,经常会遇到顶点和边动态变化的情况。例如,一个顶点可能需要根据其邻居节点的位置来计算自环的角度。在这种情况下,我们需要动态地修改 Binding 的依赖项。然而,JavaFX 的 DoubleBinding 提供的 getDependencies 方法返回的是一个不可变的列表,并且 bind 方法是受保护的,这使得直接修改 Binding 的依赖项变得困难。本文将介绍一种解决方案,通过将 DoubleProperty 绑定到一个 ObservableList 上,来实现动态依赖的效果。
利用 ObservableList 实现动态依赖
核心思想是将 DoubleProperty 绑定到一个包含邻居节点的 ObservableList 上。当列表中的节点增加或删除时,Binding 会自动失效并重新计算。这样,我们就可以避免直接修改 Binding 的依赖项,而是通过修改 ObservableList 来间接实现动态依赖。
示例代码
立即学习“Java免费学习笔记(深入)”;
以下是一个简单的示例代码,展示了如何使用 Bindings.createIntegerBinding 创建一个绑定到 ObservableList 的 IntegerProperty,并随着列表中元素的增加,自动更新总和。
import javafx.beans.binding.Bindings;import javafx.beans.property.IntegerProperty;import javafx.beans.property.SimpleIntegerProperty;import javafx.collections.FXCollections;import javafx.collections.ObservableList;public class BindingDemo { public static void main(String[] args) { ObservableList neighbors = FXCollections.observableArrayList(); IntegerProperty total = new SimpleIntegerProperty(); total.bind(Bindings.createIntegerBinding( () -> sum(neighbors), neighbors )); total.addListener((obs, oldTotal, newTotal) -> System.out.println("Total = "+newTotal)); for (int i = 1 ; i <= 5 ; i++) { System.out.println("Adding node with value "+i+":"); neighbors.add(new GraphNode(i)); } } private static int sum(ObservableList nodes) { int total = 0 ; for (GraphNode node : nodes) { total += node.value(); } return total ; } public static record GraphNode(int value){}}
代码解释
图改改
在线修改图片文字
455 查看详情
创建 ObservableList: ObservableList neighbors = FXCollections.observableArrayList(); 创建一个 ObservableList 来存储邻居节点。创建 IntegerProperty: IntegerProperty total = new SimpleIntegerProperty(); 创建一个 IntegerProperty 来存储总和。创建 Binding: total.bind(Bindings.createIntegerBinding(() -> sum(neighbors), neighbors)); 使用 Bindings.createIntegerBinding 创建一个绑定到 neighbors 的 IntegerProperty。当 neighbors 中的元素发生变化时,total 会自动更新。添加监听器: total.addListener((obs, oldTotal, newTotal) -> System.out.println(“Total = “+newTotal)); 添加一个监听器,以便在 total 的值发生变化时打印新的总和。添加节点: 循环添加 GraphNode 到 neighbors 中,每次添加都会触发 total 的更新和监听器的执行。求和函数: sum(ObservableList nodes) 函数用于计算 ObservableList 中所有节点的 value 属性的总和。
运行结果
Adding node with value 1:Total = 1Adding node with value 2:Total = 3Adding node with value 3:Total = 6Adding node with value 4:Total = 10Adding node with value 5:Total = 15
从运行结果可以看出,每次添加一个节点到 ObservableList 中,total 的值都会自动更新。
注意事项
ObservableList 必须是 JavaFX 提供的 FXCollections.observableArrayList() 创建的,才能保证其变化能够被 Binding 监听。如果需要更复杂的依赖关系,可以考虑使用 Bindings.createObjectBinding 或自定义 Binding 类。
总结
通过将 DoubleProperty 绑定到一个 ObservableList 上,我们可以有效地实现动态修改 Binding 依赖项的效果,而无需直接操作 Binding 的内部依赖列表。这种方法简单易用,并且可以很好地满足 JavaFX 图形可视化应用中动态依赖的需求。虽然这没有完全避免自定义Binding,但 Bindings.createXXXBinding(…) API 使得这个过程相当简洁。
以上就是JavaFX:动态修改 Binding 依赖项的解决方案的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/232709.html
微信扫一扫
支付宝扫一扫