java自定义JTree insertnodeinto

时间:2012-07-28 18:28:50

标签: java swing jtree

我在这里看到了许多类似的主题但却无法找到解决我的小问题的方法。

我的应用程序正在搜索文件并在jtree中显示结果。我有一个问题。当我使用insertNodeInto(...)向树添加新节点时;我可以在搜索时搜索找到的项目,但可视化存在问题。我的意思是渲染节点有一个问题 - 我真的无法正确解释,所以我包括这个图像。

enter image description here

当我在搜索结束时在jtree上使用reload时,一切都恢复正常 - 渲染是可以的,不幸的是,这会关闭用户打开的所有选项卡。

我是学生 - 抱歉我的英语很差。我希望有人知道为什么会出现这个问题。

1 个答案:

答案 0 :(得分:2)

GUI的显示方式,看起来好像是在绘图线程(事件调度线程(EDT))之外向模型中添加组件。这反过来会触发这个线程之外的绘画,这将导致不稳定的绘画。

请查看this tutorial on threads in Swing

DefaultTreeModel,很明显insertNodeInto(..)方法会触发GUI更新,所以如果没有在EDT上完成,你很容易出现你的例子中描述的绘画问题。

快速解决方法是添加类似于以下(未编译的)代码的方法:

public void safeInsertNodeInto(final MutableTreeNode newChild,
                           final MutableTreeNode parent, final int index) {
          SwingUtilities.invokeLater(
                  new Runnable(){
                       public void run(){
                            model.insertNodeInto(newChild,parent,index);
                       }
                   }
           );
 } 

然后调用该方法而不是直接调用您的模型。

那就是说,我强烈建议阅读上面引用的教程。有更多高级方法来处理EDT约束。