我有一个非常大的JTree,我想浏览从root到leaves的所有节点。
我需要根据用户输入进行某种重新调整。
例如,我希望用户对象字符串以“a”开头的所有节点在树内的新节点内重新组合。
初始: Root - Ann,John,Andrew
之后: 根 - A - 安 安德鲁 J - 约翰
我正在考虑开始迭代并为每个节点启动一堆线程,并在创建新节点时进行同步。
有什么想法吗?
答案 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。如果没有,尽管如此,还是要明白这一点。实现应该很容易,否则就会有实现。