我在这里看到过很多类似的主题,但是找不到真正解决我的小问题的解决方案。

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



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

我是学生-对不起,我的英语不好。我希望有人知道为什么出现此问题。

最佳答案

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约束。

10-02 09:55