Java JTree get first visible row

Description

Java JTree get first visible row

import java.awt.Point;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.JViewport;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

public class Main {
   public static void main(String[] args) {
      DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Root");
      DefaultMutableTreeNode a = new DefaultMutableTreeNode("A");
      rootNode.add(a);//from w w  w .  java  2s  .  c o m

      DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("1");
      a.add(a1);
      DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("2");
      a.add(a2);

      DefaultMutableTreeNode b = new DefaultMutableTreeNode("B");
      rootNode.add(b);
      DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("1");
      b.add(b1);

      JTree tree = new JTree(rootNode);

      tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
      
      int s = getFirstVisibleRow(tree);
      System.out.println(s);

      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.add(new JScrollPane(tree));
      f.setSize(250, 250);
      f.setVisible(true);
      
      s = getFirstVisibleRow(tree);
      System.out.println(s);
   }

   static int getFirstVisibleRow(JTree tree) {
      Rectangle visible = tree.getVisibleRect();
      int row = -1;
      for (int i = 0; i < tree.getRowCount(); i++) {
          Rectangle bounds = tree.getRowBounds(i);
          if (visible.y <= bounds.y
                  && visible.y + visible.height >= bounds.y
                          + bounds.height) {
              row = i;
              break;
          }
      }
      return row;
  }
}



PreviousNext

Related