使用多个线程迭代和修改jtree

时间:2012-05-15 06:30:44

标签: java swing

我有一个非常大的JTree,我想浏览从root到leaves的所有节点。

我需要根据用户输入进行某种重新调整。

例如,我希望用户对象字符串以“a”开头的所有节点在树内的新节点内重新组合。

初始: Root - Ann,John,Andrew

之后: 根 -       A - 安           安德鲁       J - 约翰

我正在考虑开始迭代并为每个节点启动一堆线程,并在创建新节点时进行同步。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

一堆线程 ...除非你的意思是你要在后台使用多个TreeModel构建一个新的Thread,然后替换你的整个TreeModel你在{1}}的{​​1}}一次性使用,这将是一个非常糟糕的主意。

只能在EDT上更改Swing组件,因此,如果您要直接在JTree上放置Thread上的多个TreeModel重新排序节点,最有可能最终导致您JTree的损坏。

答案 1 :(得分:0)

正如Robin所说,在多线程中直接在JTree上执行它会导致竞争条件。

您可以复制TreeModel并对其进行更改。但请注意,您仍然需要在线程之间进行同步。之后您可以简单地调用SwingUtilities.invokeLater并将复制和更改的模型设置为JTree的新模型。

另一个想法是分析多线程数据,用结果创建(线程安全)集合,并在EDT上用结果改变模型。拥有一棵大树并进行少量修改,这将是最快的方式(没有副本,没有完全重建树)

提示:如果您使用的是Java 7,请查看Fork / Join-Framework。如果没有,尽管如此,还是要明白这一点。实现应该很容易,否则就会有实现。