Как центрировать вертикальные и горизонтальные полосы прокрутки в 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/