Я пытаюсь динамически добавлять узлы в Java Swing JTree
, и пользователь должен иметь возможность просматривать и сворачивать иерархию, пока узлы постоянно добавляются. Когда я добавляю Thread.sleep(10)
в свой цикл, он работает нормально; но это грязный хак ...
Вот урезанный код, который вызывает эту проблему. Всякий раз, когда я запускаю это и дважды щелкаю по корневому узлу, чтобы развернуть / свернуть его (пока добавляются узлы), я получаю 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 пунктов я запускаю это, чтобы графический интерфейс мог обновляться:
// just wait so that all events in the queue can be processed
SwingUtilities.invokeAndWait(new Runnable() {
public void run() { };
});
Таким образом, у меня очень отзывчивый графический интерфейс, и он отлично работает. Спасибо!