我有两个JTrees实例(leftTree和rightTree)。用户可以从左侧树中选择一些节点,并将其添加到右侧树中。我在添加按钮操作侦听器中具有以下代码,以在添加节点后展开并在rightTree中选择该节点。

rightTree.updateUI();

TreePath[] paths = leftTree.getSelectionPaths();
if (null != paths && paths.length > 0)
{
    TreePath path = paths[0];
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
    rightTree.scrollPathToVisible(new TreePath(node.getPath()));
    rightTree.setSelectionPaths(paths);
}

leftTree.clearSelection();


该代码对于某些节点似乎工作正常,但对于leftTree中的某些其他节点则无法工作。问题是即使执行了以上代码后,rightTree仍处于折叠状态,而我看不到所选节点。

我已经尝试在JTree中使用其他方法,例如setExpandsSelectedPaths(true),expandPath(new TreePath(node.getParent()))。另外,尝试在执行上述代码后调用rightTree.repaint()或rightTree.validate()。但是问题仍然存在。但是rightTree.isExpanded(new TreePath(node.getParent()))重新运行为true;

我的树深约7-8层。请帮助我解决此问题,如果需要更多信息,请告诉我。

最佳答案

对我来说,这种方法是不正确的。实际上,TreePath是从当前节点到最高父节点的节点序列。换句话说,通过调用getParet()直到到达tull为止,创建来自节点的TreePath。
因此,如果从一棵树中获取一个节点并创建路径,则该路径是原始树中的节点序列,而第二棵树中的路径是徒劳的,因为目标树模型中不存在该路径中的某些节点。

您需要获取选定的节点并在第二棵树中找到一个合适的节点。猜一个具有相同用户对象的节点。在目标树中找到的节点(如果找到)的,创建TreePath并选择/扩展。

10-04 23:25