2016-09-09 4 views
1

У меня есть JScrollPane с JPanel на нем. У меня также есть много разных компонентов на JPanel (например, Labels, JTextFields, JTextAreas). Эти компоненты добавляются программно (во время выполнения, по запросу пользователя). JPanel использует SpringLayout. Программа вычисляет предпочтительный размер JPanel после добавления компонентов, поскольку прокрутка не работает должным образом без вычисления. Добавление компонентов и вычисление предпочтительного размера являются частью моего метода prepareGui(). Данные, отображаемые на компонентах, периодически обновляются (в моем методе refreshData(), который вызывается слушателем).Полоса прокрутки перемещается после обновления данных

Моя проблема: после обновления, полоса прокрутки всегда устанавливается в фиксированное положение (я не знаю почему). Я хочу, чтобы полоса прокрутки оставалась в старой позиции после обновления.

Я попытался найти место, где перемещается полоса прокрутки. Я проверил некоторые значения в начале и в конце RefreshData() метод, но они были одинаковыми (они не изменились внутри RefreshData()):

scrollPane.getVisibleRect().getX() 
scrollPane.getVisibleRect().getY() 
scrollPane.getVisibleRect().getWidth() 
scrollPane.getVisibleRect().getHeight() 
panel.getVisibleRect().getX() 
panel.getVisibleRect().getY() 
panel.getVisibleRect().getWidth() 
panel.getVisibleRect().getHeight() 
scrollPane.getHorizontalScrollBar().getX() 
scrollPane.getHorizontalScrollBar().getY() 
scrollPane.getHorizontalScrollBar().getWidth() 
scrollPane.getHorizontalScrollBar().getHeight() 
scrollPane.getHorizontalScrollBar().getValue() 
scrollPane.getVerticalScrollBar().getX() 
scrollPane.getVerticalScrollBar().getY() 
scrollPane.getVerticalScrollBar().getWidth() 
scrollPane.getVerticalScrollBar().getHeight() 
scrollPane.getVerticalScrollBar().getValue() 

Смена менеджера компоновки не брал эффект.

Я заметил одно (я не знаю, имеет ли он какой-либо смысл). Когда я устанавливаю только предпочтительный размер (в prepareGui()), полоса прокрутки перемещается в конец. Когда я устанавливаю также размер, полоса прокрутки перемещается в странное фиксированное положение.

Как я могу предотвратить это? Полоса прокрутки должна сохранять текущее положение.

ответ

1

Я наконец нашел ответ здесь: https://stackoverflow.com/a/5230477/5694159 (спасибо Йохану М) в теме про JTextArea вместо JPanel. Когда refreshData() вызывается в отдельном потоке, он работает хорошо.

Я надеюсь, что этот вопрос и ответ помогут кому-то.

Смежные вопросы