4

JTree をトラバースする方法 (それが可能) を探し、各ノードをチェックして、(ユーザーに) 表示されているかどうかを確認します。JTree にこの機能がないなんて信じられません。

4

2 に答える 2

5

次の 2 つの異なる点を考慮する必要があります。

  1. ノードは、その親の 1 つを閉じることによって非表示にすることができます。親は画面に表示されますが、子は表示されません。これにはJTree.isVisible()を使用します。

  2. ノードが展開されると、現在のビューポートからスクロールされるため、非表示になる可能性があります。これは JTree では処理されませんが、ツリーをラップするJScrollPaneで処理されます。ノードがビューポートの可視領域にあるかどうかを確認します。

#2 が true かどうかを確認するには、ノードが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 に答える