寻找如何遍历 JTree(可以这样做)并检查每个节点以查看它是否显示(对用户)或不可见。不敢相信JTree没有这个功能,也许我错过了什么?
问问题
3344 次
2 回答
5
您必须考虑两件不同的事情:
一个节点可以通过关闭其父节点之一来隐藏。即使父母在屏幕上可见,但孩子却不是。为此使用JTree.isVisible()。
如果节点被展开,它可能会因为滚动出当前视口而被隐藏。这不在 JTree 中处理,而是在包装树的JScrollPane中处理。找出节点是否在视口的可见区域中。
要确定 #2 是否为真,您必须获取节点使用JTree.getPathBounds()所在的矩形。然后,您必须将此矩形与视口相交(使用scrollPane.getViewport().getViewRect()
. 如果nodeRect.intersects (viewRect)
返回true
,则节点可见。
于 2010-05-12T21:07:34.260 回答
3
根据您的应用程序,仅查找可见节点可能更有效,而不是遍历 中的所有节点TreeModel
并确定每个节点是否可见。执行此操作的示例函数如下所示:
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class JTreeTools {
public static List<TreeNode> getVisibleNodes(JScrollPane hostingScrollPane, JTree hostingJTree){
//Find the first and last visible row within the scroll pane.
final Rectangle visibleRectangle = hostingScrollPane.getViewport().getViewRect();
final int firstRow = hostingJTree.getClosestRowForLocation(visibleRectangle.x, visibleRectangle.y);
final int lastRow = hostingJTree.getClosestRowForLocation(visibleRectangle.x, visibleRectangle.y + visibleRectangle.height);
//Iterate through each visible row, identify the object at this row, and add it to a result list.
List<TreeNode> resultList = new ArrayList<TreeNode>();
for (int currentRow = firstRow; currentRow<=lastRow; currentRow++){
TreePath currentPath = hostingJTree.getPathForRow(currentRow);
Object lastPathObject = currentPath.getLastPathComponent();
if (lastPathObject instanceof TreeNode){
resultList.add((TreeNode)lastPathObject);
}
}
return(resultList);
}
}
于 2013-05-21T17:50:33.167 回答