2012-06-03 37 views
1

我有这个非常大的项目,我正在使用图形编辑器,而且我有一些使用swing组件的大问题。但是,现在我有一个程序员最糟糕的噩梦,一个只发生在的一些错误JTree有时不扩展

如果我尝试选择我的JTree中的元素,无论是添加元素还是在图(JInternalFrame)中选择它们时选择元素,其中一些元素都不会展开。

我的结构是这样的,我有一个工作区,包含项目和包含图表的项目。图表包含我拥有的所有元素,例如圆圈,矩形等等,在文件夹中(如果它们是圆圈,则放在圆圈文件夹中...)。

要知道的另一件事是,我通过我的JTreesetSelectedPath/Paths方法选择我的元素。

一些东西,可能有助于理解我所做的事情和我的尝试:

  • 我确信我的节点都知道怎么去根。 (getTreeModel.getPathToRoot回报好的路径)
  • 我尝试添加路径树选择模型和树直接
  • 我已经设置了树木expandsSelectedPaths
  • 节点被选择时,我手动展开我的树(他们甚至后来扩展) ,直到我再补充一点引起的问题
  • 这发生约一次通过5种元素的切换时,当我尝试添加其他类型的元素后,我加入一个由问题
一些奇怪的事情发生类型的新元素

I hop é有人会知道该怎么做,但我认为这是非常复杂的问题。请问任何可能帮助你的东西。

+0

你在IDE吗?尝试调试器,并检查JTree扩展时触发的事件,希望在这里找到有用的东西,如果在NetBeans上,请尝试**可视调试器** – Asif

+0

确保所有GUI更新都在EDT上执行。如果失败,请发布[SSCCE](http://sscce.org/)。 –

+0

@Asif它触发树扩展事件我使用treeExpansionListener捕获所有扩展,但其中的一些只是不显示在GUI上。 安德鲁,我担心做一个SSCCE太复杂了,我只会在绝对必要的时候才会这么做 –

回答

3

好的,谢谢大家的回答,但我发现了一个非常简单的解决方法。 如果最后一个路径组件是叶子,出于某种原因,扩展的东西不起作用。

我所做的只是让我的叶节点返回假isLeaf方法,我所有的问题都消失了。

1
  • 如果addWhatever()JTree射击正确​​(fireChildAdded()firePathChanged()fireChildrenLoaded()treeStructureChanged()

  • 对GUI的所有更改会被移动到BackGround Task(s),请看看SwingWorkerRunnable#Thread(最清晰最简单的方式),但需要Runnable#Thread将所有输出(Swing方法)包装到invokeLater

+0

好的,我在理解方面有些麻烦,但我想你想要我检查是否所有这些事件都被调用(对于第一个点),然后将树GUI的所有更改移动到'SwingUtilities.invokeLater'? –

+0

如果您从JTree视图添加新路径,则默认情况下所有更改都在TreeModel中,但是如果您从Xml,File,Database加载JTree结构,则对TreeModel的所有更新都应该封装到invokeLater – mKorbel

+0

是'JTree'特别擅长揭露EDT问题;这[问题](http://stackoverflow.com/q/7787998/230513)引用了检测这种违规的方法。另请参阅[初始线程](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod