Java JTree - How to check if node is displayed?
Asked Answered
A

2

5

Looking for how to traverse a JTree (can do that) and check to see each node to see if it's displayed (to the user) or not visible. Can't believe JTree doesn't have this function, maybe I'm missing something?

Avram answered 12/5, 2010 at 20:54 Comment(0)
C
6

You must consider two different things:

  1. A node can become hidden by closing one of its parents. Even though the parent is visible on the screen, the child isn't. Use JTree.isVisible() for this.

  2. If the node is expanded, it can become hidden because it is scrolled out of the current viewport. This isn't handled in the JTree but in the JScrollPane which wraps the tree. To find out if a node is in the visible area of the viewport.

To find out if #2 is true, you must get the rectangle where the node is using JTree.getPathBounds(). Then, you must intersect this rectangle with the viewport (use scrollPane.getViewport().getViewRect(). If nodeRect.intersects (viewRect) returns true, the node is visible.

Coetaneous answered 12/5, 2010 at 21:7 Comment(1)
dammmnn I knew it had to do with the viewport. Thanks!Avram
R
3

Depending on your application, it may be more efficient to just look for the visible nodes, rather than iterating through all nodes in the TreeModel and determining if each is visible. A sample function to perform this is shown below:

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);
    }   
}
Release answered 21/5, 2013 at 17:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.