我尝试将节点动态添加到 Java SwingJTree
中,并且用户应该能够在不断添加节点的同时浏览和折叠层次结构。当我Thread.sleep(10)
在循环中添加 a 时,它工作正常;但这是一个肮脏的黑客......
这是触发此问题的精简代码。每当我运行它并双击根节点以展开/折叠它(添加节点时),我都会得到一个ArrayIndexOutOfBoundsException
. 当我添加一个Thread.sleep(10)
这不会发生。我想这是一个线程问题,但我不知道如何同步?任何提示将不胜感激!
public static void main(String[] args) throws InterruptedException {
final JFrame frame = new JFrame();
frame.setSize(600, 800);
frame.setVisible(true);
MutableTreeNode root = new DefaultMutableTreeNode("root");
final DefaultTreeModel model = new DefaultTreeModel(root);
final JTree tree = new JTree(model);
frame.add(new JScrollPane(tree));
while (true) {
MutableTreeNode child = new DefaultMutableTreeNode("test");
model.insertNodeInto(child, root, root.getChildCount());
tree.expandRow(tree.getRowCount() - 1);
// uncommenting this to make it work
// Thread.sleep(10);
}
}
我想将其用于打字搜索应用程序,因此(几乎)提供即时结果对我来说至关重要。
编辑:感谢您的快速回答!SwingUtilities.invokeLater()
解决问题。
我现在这样做:
- 在其中添加 100 个项目
SwingUtilities.invokeLater();
在 100 个项目之后,我运行它以便更新 GUI:
// just wait so that all events in the queue can be processed SwingUtilities.invokeAndWait(new Runnable() { public void run() { }; });
这样我就有了一个响应速度非常快的 GUI,而且效果很好。谢谢!