1

我正在寻找一种线程解决方案来每秒更新我的 JTree。

基本上,我...

  • 导入外部文件
  • 从中创建一个枚举
  • 从枚举中构建树

外部文件可以随机变化,树中的数据需要以某种合理的时间方式表示这种变化。我如何能够在不重新绘制 JTree(通过面板)所在的整个内容窗格的情况下重新绘制树?

谢谢!

4

5 回答 5

4

只需让 JTree 的模型触发更新,JTree 就会重新绘制自己。最简单的方法是使用 DefaultTreeModel,当文件更改时,从文件中构造 TreeNodes(可能使用 DefaultMutableTreeNode),并在模型上调用 setRoot() 与新创建的节点树的基节点。

于 2009-09-17T18:46:12.623 回答
1

我猜你可能在其他地方读到过这个:Swing 不是线程保存;)。如果无论如何你想从不同的线程更新一个 Swing 组件,你必须让另一个线程在 Swing 的事件线程上推送它的更新。执行此操作的方法是 EventQueue.invokeAndWait(Runnable)。

这是一个类似问题的代码示例(使 JTree 与目录树同步): http ://www.onyxbits.de/content/java-and-directory-trees-joy-implementing-simple-filemanager

您应该对 FileMonitor.java 文件感兴趣。

于 2009-11-03T22:57:33.963 回答
1

如果您的树使用 DefaultTreeModel,请尝试此操作

((DefaultTreeModel)yourTree.getModel()).reload();
于 2011-09-20T23:24:00.420 回答
0

如果您重新绘制JTree组件,则绘制区域将被裁剪掉包含面板的其余部分。

于 2009-09-17T18:05:59.450 回答
0

如果你有很多节点,我会做类似@Tom 建议的事情。@CarlG 的解决方案可能适用于少数节点。如果更新整个树模型,每一秒都会遇到性能问题。

如果需要,我只会更新树的可见边界,并在某处保留一些 AST(语法树)。如果树模型(来自解析的文档)每秒都在变化,我严重怀疑用户是否有时间每秒滚动所有树。

User scrolled to bounds XXX
A = First visible node
B = Last visible node
if someRangeBefore(A) is dirty update
If region(A, B) is dirty
  update nodes

实施一个有效且非常有效的策略来更新节点会比上面更复杂。

于 2009-09-18T12:45:37.980 回答