Java JTree - Как проверить, отображается ли узел? - PullRequest
3 голосов
/ 13 мая 2010

Поиск того, как пройти по JTree (может сделать это) и проверить, чтобы увидеть каждый узел, чтобы увидеть, отображается ли он (для пользователя) или нет. Не могу поверить, что у JTree нет этой функции, может, я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 13 мая 2010

Вы должны учитывать две разные вещи:

  1. Узел может стать скрытым, закрыв одного из его родителей. Хотя родитель виден на экране, ребенок - нет. Для этого используйте JTree.isVisible () .

  2. Если узел развернут, он может стать скрытым, поскольку он прокручивается из текущего окна просмотра . Это не обрабатывается в JTree, а в JScrollPane , который оборачивает дерево. Чтобы выяснить, находится ли узел в видимой области области просмотра.

Чтобы узнать, является ли # 2 истинным, вы должны получить прямоугольник, в котором используется узел JTree.getPathBounds () . Затем вы должны пересечь этот прямоугольник с окном просмотра (используйте scrollPane.getViewport().getViewRect(). Если nodeRect.intersects (viewRect) возвращает true, узел виден.

2 голосов
/ 21 мая 2013

В зависимости от вашего приложения может быть более эффективным просто искать видимые узлы, а не выполнять итерацию по всем узлам в 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);
    }   
}
...