JScrollPane автоматически устанавливает позицию ViewPort в (0,0)

У меня есть JScrollPane чей видовой экран является подклассом JPanel, Эта панель выложена с BoxLayout и при взаимодействии с пользователем горизонтальная ширина компонентов может измениться. Когда имеется достаточно компонентов, таких как полосы прокрутки, необходимо изменить горизонтальный размер компонента и затем вызвать revalidate() на JPanel подкласс (вид в окне просмотра) всегда будет приводить к сбросу панели прокрутки в (0,0).

Я хотел бы сохранить текущий вид, поэтому я настроил компонентный слушатель и componentMoved() Я храню значение в getLocation() (это все в подклассе JPanel или в окне просмотра). Сразу после звонка revalidate() Я звоню setLocation() с сохраненным местоположением (в потоке отправки событий). Однако это вызывает скачок, когда позиция просмотра установлена ​​на (0,0), а затем сразу переходит к сохраненному местоположению. Есть ли способ остановить JScrollPane вернуться к (0,0)? Есть ли лучший способ сказать, что размер его окна просмотра изменился?

Я пытался выяснить, где (0,0) исходит от подкласса JScrollBar и переопределение setValue() и установка точки останова, но она не попадает туда (а когда я перемещаю колесо прокрутки), поэтому я предполагаю, что она устанавливается внутри. Кто-нибудь знает, что может происходить?

1 ответ

Решение

Попробуйте другой способ вызвать код после revalidate() до repaint(),

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

В качестве альтернативы вы можете попробовать позвонить panel.scrollRectToVisible(Rectangle)

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