Как центрировать вертикальные и горизонтальные полосы прокрутки в JScrollPane?

У меня есть JPanel с JLabel, добавленный в JScrollPane. У меня есть actionListener, который вызывает JLabel.setIcon("file.jpg");, Изображение отображается в JScrollPane правильно и в полном размере. Полосы прокрутки выглядят отлично. Я пытаюсь расположить вертикальные и горизонтальные полосы прокрутки в центре по умолчанию, чтобы вы смотрели в центр изображения по умолчанию.

Есть ли метод JScrollPane, который поместит область просмотра в центр изображения? Или я мог бы вручную установить положение каждой полосы прокрутки на максимальный размер, деленный на 2?

я пытался

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

Пока он компилируется, он не центрирует полосу прокрутки. Я также попытался установить менеджер компоновки моего JPanel в GridBagLayout, но это тоже не работает.

3 ответа

Решение

По сути, вам нужно знать размер видимой области области просмотра.

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

Тогда вам нужен размер компонента, но как только он будет добавлен в панель прокрутки, вы можете получить его из порта просмотра...

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

Теперь вам нужно рассчитать центральную позицию...

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

Тогда вам нужно просто настроить положение порта просмотра...

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

Помните, что это сработает только после того, как на экране будет реализована панель прокрутки (или, по крайней мере, она будет размещена в родительском контейнере).

Я предполагаю, что изображение не было прочитано в то время, когда вы пытаетесь выполнить свой код, поэтому попробуйте что-то вроде следующего:

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 );
    }
});

Это добавит код в конец потока диспетчеризации событий, поэтому, надеюсь, он будет выполнен после того, как изображение будет полностью прочитано, а все значения полосы прокрутки обновлены.

Добавить AdjustmentListener и посмотрим, поможет ли это. Это даст вам знать, если значение компонента изменится. Таким образом, когда изображение будет добавлено, свойства полосы прокрутки изменятся, и вы получите уведомление. Затем вы можете попытаться установить положение каретки в середине.

Учебное пособие: http://examples.javacodegeeks.com/desktop-java/awt/event/adjustmentlistener-example/

Другие вопросы по тегам