How to auto scroll to bottom in Java Swing

2019-04-29 18:48发布

问题:

I have a simple JPanel with a JScrollPane (with vertical scrollbar as needed) on it.

Things get added to (or removed from) the JPanel and when it goes beyond the bottom of the panel, I want the JScrollPane to scroll down to the bottom automatically as needed or scroll up if some components go away from the panel.

How shall I do this? I am guessing I need some kind of listener which gets called whenever the JPanel height changes? Or is there something as simple as JScrollPanel.setAutoScroll(true)?

回答1:

When you add/remove components for a panel you should invoke revalidate() on the panel to make sure the components are laid out properly.

Then, if you want to scroll to the bottom then you should be able to use:

JScrollBar sb = scrollPane.getVerticalScrollBar();
sb.setValue( sb.getMaximum() );


回答2:

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
        public void adjustmentValueChanged(AdjustmentEvent e) {  
            e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
        }
    });

This would be the best. Found from JScrollPane and JList auto scroll



回答3:

This is how I scroll all the way up or down automatically:

/**
 * Scrolls a {@code scrollPane} all the way up or down.
 *
 * @param scrollPane the scrollPane that we want to scroll up or down
 * @param direction  we scroll up if this is {@link ScrollDirection#UP},
 *                   or down if it's {@link ScrollDirection#DOWN}
 */
public static void scroll(JScrollPane scrollPane, ScrollDirection direction) {
    JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
    // If we want to scroll to the top, set this value to the minimum,
    // else to the maximum
    int topOrBottom = direction == ScrollDirection.UP ?
                      verticalBar.getMinimum() :
                      verticalBar.getMaximum();

    AdjustmentListener scroller = new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            Adjustable adjustable = e.getAdjustable();
            adjustable.setValue(topOrBottom);
            // We have to remove the listener, otherwise the
            // user would be unable to scroll afterwards
            verticalBar.removeAdjustmentListener(this);
        }
    };
    verticalBar.addAdjustmentListener(scroller);
}

public enum ScrollDirection {
    UP, DOWN
}