我有两个JTree实例(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级。请帮我解决这个问题,如果您需要更多信息请告诉我。
答案 0 :(得分:1)
对我而言,方法不正确。 TreePath实际上是从当前节点到最顶层父节点的节点序列。换句话说,通过调用getParet()直到达到tull来创建节点的TreePath。 因此,如果从一个树获取节点并创建路径,则路径是原始树中的节点序列,并且路径在第二个树中是徒劳的,因为路径中的某些节点在目标树模型中不存在。
您需要获取所选节点并在第二个树中找到合适的节点。猜测具有相同用户对象的节点。目标树中找到的节点(如果我们找到它)创建TreePath并选择/展开。