我正在使用 JUNG 或 Prefuse 从 GraphML 源文件渲染图形。现在另一个程序用新的节点和边定期更新这个源文件。我也想更新图表以反映这些变化。我在这两个 API 本身中都找不到任何让我这样做的东西(没有适当的刷新(TIMER)或重绘(TIMER)类型的方法)。这样做的一种方法可能是在一段时间后终止 JFrame 并再次重做整个数据加载、可视化和渲染过程,但这对我来说似乎不合适。
所以问题是,什么是尽可能简单和快速地做到这一点的最佳方法?谢谢 :)
我正在使用 JUNG 或 Prefuse 从 GraphML 源文件渲染图形。现在另一个程序用新的节点和边定期更新这个源文件。我也想更新图表以反映这些变化。我在这两个 API 本身中都找不到任何让我这样做的东西(没有适当的刷新(TIMER)或重绘(TIMER)类型的方法)。这样做的一种方法可能是在一段时间后终止 JFrame 并再次重做整个数据加载、可视化和渲染过程,但这对我来说似乎不合适。
所以问题是,什么是尽可能简单和快速地做到这一点的最佳方法?谢谢 :)
“定期”检查源文件。如果你挂在f
文件的句柄上,你可以查询f.lastModified()
,如果自上次检查以来其他程序已经完成了它的脏工作,更新!如果其他程序仅编写更新文件(如果您有能力进行更改,这将是明智的 - 更少的文件要读取,确切地知道要在模型中更改什么等),则适用类似的解决方案。
“定期”有点棘手-您的情况可能很简单,以至于“每X(毫秒)秒检查一次”就可以了。Java 中的周期性任务可以通过多种方式实现 - 参见,例如this other question。
JUNG 在更新演示中重新渲染/重新绘制,例如这个。他们文档中链接的教程(pdf) 涵盖了第 5 节中的动态更新(该部分是关于交互性的,但在出现新信息时进行更新的必要条件都已涵盖)。
JUNG 提供了允许你监听变化的包装器(ObservableGraph)。
收到更新通知后,您必须更新布局,然后刷新可视化。后者以 Swing 的常用方式完成。