Как правильно изменить содержимое панели при перетаскивании дескриптора jscrollbar

У меня есть панель с изображением, которое изменяется во время прокрутки. Содержимое правильно обновляется с помощью события колеса прокрутки, потому что я реализовал прослушиватель колеса, который перерисовывает изображение перед установкой нового значения прокрутки.

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

Однако это решение (несмотря на 10-миллисекундные корректировки) приводит к скачкообразной прокрутке. Изображение перемещается (без необходимых корректировок изображения), а затем постфактум корректируется каждые 10 миллисекунд.

Первоначально я пробовал настроить прослушиватель, но он получает событие только после того, как дескриптор отпущен. Как я могу обновить содержимое панели в реальном времени во время перетаскивания дескриптора jscrollbar ДО ТОГО, как механизм полосы прокрутки начнет просто перемещать мой контент, как если бы это было статическое изображение? Могу ли я каким-то образом дать механизму полосы прокрутки понять, что содержимое изменилось или что-то в этом роде каждый раз, когда оно пытается перерисовать содержимое? Или я могу отключить способность полосы прокрутки перемещать изображение и просто полагаться на свой таймер?


person hepcat72    schedule 02.09.2015    source источник
comment
Почему бы просто не добавить ChangeListener в BoundedRangeModel JScrollBar? Чтобы получить более подробный ответ, создайте и опубликуйте свой минимально воспроизводимый пример.   -  person Hovercraft Full Of Eels    schedule 02.09.2015
comment
Вы добавляете прослушиватель мыши на панель jscrollbar и используете метод слушателя mouseEntered для ответа.   -  person c0der    schedule 02.09.2015
comment
Я попробовал предложение ChangeListener, и метод stateChanged срабатывает только после дескриптора прокрутки, а не во время перетаскивания, что мне и нужно. РЕДАКТИРОВАТЬ: Упс, я сделал это неправильно. Ты прав! Похоже, это то, что мне нужно! Потрясающий. Я отправлю обратно, если я могу заставить его работать. До сих пор я пробовал только отладочные отпечатки.   -  person hepcat72    schedule 02.09.2015
comment
Ага! ChangeListener сделал это! Я смог удалить свой таймер и использовать прослушиватель изменений для настройки изображения. Теперь все выглядит гладко, как стекло! Вы опубликуете ответ, и я приму его!   -  person hepcat72    schedule 02.09.2015


Ответы (1)


Я бы порекомендовал вам добавить ChangeListener в модель JScrollBar, BounderedRangeModel, а затем на основе значения модели, а также ее максимума и минимума, изменить свое изображение. Если вы меняете изображения, самый простой способ сделать это — поменять местами ImageIcon JLabel.

person Hovercraft Full Of Eels    schedule 02.09.2015
comment
На самом деле я не меняю изображение. Я рисую контент динамически каждый раз, и он меняется в зависимости от положения прокрутки. Но несмотря ни на что, ChangeListener был именно тем, что мне было нужно. Все, что мне нужно было сделать в stateChanged, это инициировать изменения моего изображения, а затем вызвать перерисовку. - person hepcat72; 02.09.2015