ActionCallback (final @NotNull JTree tree, final TreePath path, boolean center) { tree.makeVisible(path); Rectangle bounds = tree.getPathBounds(path); if (bounds == null) return ActionCallback.REJECTED; if (center) { Rectangle visible = tree.getVisibleRect(); if (visible.y < bounds.y + bounds.height && bounds.y < visible.y + visible.height) { center = false; // disable centering if the given path is already visible } } if (center) { return showRowCentred(tree, tree.getRowForPath(path)); } else { final int row = tree.getRowForPath(path); return showAndSelect(tree, row - ScrollingUtil.ROW_PADDING, row + ScrollingUtil.ROW_PADDING, row, -1); } }