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項目後、GUIを更新できるように、これを実行します。
// just wait so that all events in the queue can be processed SwingUtilities.invokeAndWait(new Runnable() { public void run() { }; });
このように、私は非常に応答性の高いGUIを使用しており、完全に機能します。ありがとう!