2010-05-12 5 views
3

Vous cherchez comment traverser un JTree (pouvez le faire) et vérifier pour voir chaque nœud pour voir si elle est affichée (à l'utilisateur) ou non visible. Je ne peux pas croire que JTree n'a pas cette fonction, peut-être qu'il me manque quelque chose?Java JTree - Comment vérifier si le noeud est affiché?

Répondre

5

Vous devez considérer deux choses différentes:

  1. Un nœud peut devenir caché en fermant l'un de ses parents. Même si le parent est visible à l'écran, l'enfant ne l'est pas. Utilisez JTree.isVisible() pour cela.

  2. Si le noeud est développé, il peut être masqué car il est sorti du fichier viewport. Ceci n'est pas géré dans le JTree mais dans le JScrollPane qui enveloppe l'arbre. Pour savoir si un noeud se trouve dans la zone visible de la fenêtre.

Pour savoir si # 2 est vrai, vous devez obtenir le rectangle où le nœud utilise JTree.getPathBounds(). Ensuite, vous devez l'intersection avec ce rectangle avec la fenêtre (utilisez scrollPane.getViewport().getViewRect(). Si nodeRect.intersects (viewRect) retours true, le nœud est visible.

+0

dammmnn Je savais qu'il fallait faire avec la fenêtre Merci.! – Hezeus

2

En fonction de votre application, il peut être plus efficace de regarder juste pour les noeuds visibles, plutôt que itérer . tous les nœuds du TreeModel et déterminer si chacun est visible Une fonction d'échantillonnage pour effectuer c'est indiqué ci-dessous:

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); 
    } 
} 
Questions connexes