Java JTree scroll to tree root
import java.awt.Container; import java.awt.FlowLayout; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; public class Main { public static void main(String args[]) { final JFrame f = new JFrame("JTree Demo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.setLayout(new FlowLayout()); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Computer"); DefaultMutableTreeNode c1 = new DefaultMutableTreeNode("A"); DefaultMutableTreeNode c2 = new DefaultMutableTreeNode("B"); DefaultMutableTreeNode c3 = new DefaultMutableTreeNode("C"); root.add(c1);//from www . j a v a 2s. co m root.add(c2); root.add(c3); c1.add(new DefaultMutableTreeNode("1")); c1.add(new DefaultMutableTreeNode("2")); c2.add(new DefaultMutableTreeNode("3")); c2.add(new DefaultMutableTreeNode("4")); c3.add(new DefaultMutableTreeNode("5")); c3.add(new DefaultMutableTreeNode("6")); JTree t = new JTree(root); moveHome(t); c.add(new JScrollPane(t)); f.pack(); f.setVisible(true); } public static void moveHome(JTree tree) { showRowCentred(tree, 0); } private static void showRowCentred(JTree tree, int row) { showRowCentred(tree, row, true); } public static void showRowCentred(JTree tree, int row, boolean centerHorizontally) { int visible = getVisibleRowCount(tree); int top = visible > 0 ? row - (visible - 1) / 2 : row; int bottom = visible > 0 ? top + visible - 1 : row; showAndSelect(tree, top, bottom, row, centerHorizontally); } private static int getVisibleRowCount(JTree tree) { Rectangle visible = tree.getVisibleRect(); int count = 0; 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) { count++; } } return count; } private static void showAndSelect(JTree tree, int top, int bottom, int row, boolean centerHorizontally) { int size = tree.getRowCount(); if (size == 0) { tree.clearSelection(); return; } if (top < 0) { top = 0; } if (bottom >= size) { bottom = size - 1; } Rectangle topBounds = tree.getRowBounds(top); Rectangle bottomBounds = tree.getRowBounds(bottom); Rectangle bounds; if (topBounds == null) { bounds = bottomBounds; } else if (bottomBounds == null) { bounds = topBounds; } else { bounds = topBounds.union(bottomBounds); } if (bounds != null) { TreePath path = tree.getPathForRow(row); if (path != null && path.getParentPath() != null) { Rectangle parentBounds = tree.getPathBounds(path .getParentPath()); if (parentBounds != null) { bounds.x = parentBounds.x; } } if (!centerHorizontally) { bounds.x = 0; bounds.width = tree.getWidth(); } else { bounds.width = Math.min(bounds.width, tree.getVisibleRect().width); } tree.scrollRectToVisible(bounds); } tree.setSelectionRow(row); } }