繁体   English   中英

Java JTree - 如何检查节点是否显示?

[英]Java JTree - How to check if node is displayed?

寻找如何遍历JTree(可以这样做)并检查每个节点是否显示(对用户)或不可见。 不能相信JTree没有这个功能,也许我错过了什么?

你必须考虑两件事:

  1. 通过关闭其父节点之一可以隐藏节点。 即使父母在屏幕上可见,但孩子却不是。 为此使用JTree.isVisible()

  2. 如果节点已展开,则它可能会被隐藏,因为它已滚出当前视口 这不是在JTree中处理的,而是在包装树的JScrollPane中处理的。 确定节点是否位于视口的可见区域中。

要确定#2是否为true,必须获取节点使用JTree.getPathBounds()的矩形。 然后,您必须将此矩形与视口相交(使用scrollPane.getViewport().getViewRect() 。如果nodeRect.intersects (viewRect)返回true ,则该节点可见。

根据您的应用程序,仅查找可见节点可能更有效,而不是遍历TreeModel所有节点并确定每个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);
    }   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM