为了创建我的动态 JTree,我在 this website in chapter "4.2 OutlineNode.java" 上阅读了关于 Dynamic JTrees 的教程。
现在我已经实现了它并且认识到在 GUI 线程中加载数据需要很长时间并且也很丑陋。因此,我添加了一个线程来扩展子节点,然后将 TreeNode
元素添加到树中。
private void getChildNodes() {
areChildrenDefined = true;
Thread t = new Thread(new Runnable()
{
@Override
public void run() {
System.out.println("Expand");
final List<DECTTreeNode> listNodes = new ArrayList<DECTTreeNode>();
if (castNode().canExpand())
{
for(DECTNode crt : castNode().getChildren())
{
DECTTreeNode treeNode = new DECTTreeNode(crt);
listNodes.add(treeNode);
}
try {
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run() {
System.out.println(listNodes.size());
for (DECTTreeNode crt : listNodes)
{
add(crt); // <==== Adds the node to the JTree
}
}
});
//}).run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
t.start();
}
没有线程,它可以正常工作。如果我添加线程并将 add
调用放入 SwingUtilities.invokeAndWait(...)
,子项似乎已展开,但它们在树。
我已经在树上尝试了 revalidate()
和 repaint()
- 没有任何效果。
知道如何让这些元素可见吗?
提前谢谢你。
最佳答案
检查您的 add() 方法是否触发了正确的 TreeModelEvent
关于java - 动态 JTree 和 SwingUtilities.invokeLater() 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9259787/