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)