How do I center the vertical and horizontal scrollbars in a JScrollPane?

5.7k views Asked by At

I have a JPanel with a JLabel in it, added to a JScrollPane. I have an actionListener that calls JLabel.setIcon("file.jpg");. The image is displayed in the JScrollPane correctly and is full size. The scrollbars appear perfectly. I am trying to position the vertical and horizontal scrollbars in the center by default so you are looking at the center of the image by default.

Is there a JScrollPane method that will position the viewport on the center of the image? Or could I manually set the position of each scrollbar to max size divided by 2?

I have tried

JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMaximum() / 2);

While it compiles it does not center the scrollbar. I have also tried setting the layout manager of my JPanel to GridBagLayout but that doesn't work either.

3

There are 3 answers

1
MadProgrammer On BEST ANSWER

Basically, you need to know the size of the viewport's viewable area.

Rectangle bounds = scrollPane.getViewport().getViewRect();

Then you need the size of the component, but once it's added to the scroll pane, you can get this from the view port...

Dimension size = scrollPane.getViewport().getViewSize();

Now you need to calculate the centre position...

int x = (size.width - bounds.width) / 2;
int y = (size.height - bounds.height) / 2;

Then you need to simply adjust the view port position...

scrollPane.getViewport().setViewPosition(new Point(x, y));

Now, remember, this is only going to work once the scroll pane has being realised on the screen (or at least it has being laid out within it's parent container)

0
An SO User On

Add an AdjustmentListener and see if that helps. It will let you know if the value of the component changes. That way, when the image is added, the scroll bar's properties will change and you will be notified. You can then try to set the caret position to the mid.

Tutorial: http://examples.javacodegeeks.com/desktop-java/awt/event/adjustmentlistener-example/

0
camickr On

I'm guessing that the image has not been read at the time you try to execute your code so try something like the following:

label.setIcon( new ImageIcon("...") );

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        Rectangle bounds = scrollPane.getViewport().getViewRect();

        JScrollBar horizontal = scrollPane.getHorizontalScrollBar();
        horizontal.setValue( (horizontal.getMaximum() - bounds.width) / 2 );

        JScrollBar vertical = scrollPane.getVerticalScrollBar();
        vertical.setValue( (vertical.getMaximum() - bounds.height) / 2 );
    }
});

This will add code to the end of the Event Dispatch Thread so hopefully it executes after the image has been read in completely and the scrollbar values have all been updated.