Я хочу определить, когда ScrollPane завершает прокрутку в моем приложении, чтобы отключить некоторые триггеры при перемещении, чем помочь сделать пользовательский интерфейс немного чище. Я нашел триггер, когда он движется, но я не могу найти триггер или способ определить, когда он останавливается
scrollPane.vvalueProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (oldValue!=newValue) {
isScrolling = true;
} else {
isScrolling = false;
}
}
});
Очевидно, я знаю, что проблема в том, что нет слушателя или быстрого способа доступа к точной точке остановки, как это есть для обнаружения изменения. Принятый ответ работает, но он немного сложнее, чем метод обнаружения изменения.
тогда зачем вы реализуете этот блок «ничего не делать», если он настолько очевидный, что он никогда не достигается? хотите запутать коллегу?
Если у вас нет точного ответа, возможно, не стоит отвечать на вещи просто для придирки :)
Вам нужно будет сделать это с помощью внешнего таймера или javafx.animation.Timeline. Используйте шкалу времени, если вы меняете пользовательский интерфейс.
Установите флаг, например lastScrollSeen
, как дату и время, и активируйте этот таймер, когда вы впервые получите событие прокрутки. Обновляйте lastScrollSeen
каждый раз, когда вы получаете другое событие прокрутки, и через определенные промежутки времени (используя таймер / временную шкалу) проверяйте, прошло ли достаточно времени без дополнительного события прокрутки, чтобы вы могли быть уверены, что пользователь завершил прокрутку.
На этом этапе сделайте свою работу, чтобы отключить триггеры и очистить флаг и таймер.
ChangeListeners уведомляются только в том случае, если значение изменилось, поэтому вы никогда не дойдете до блока else (как вы заметили;). Не совсем понимаете, что вам нужно, предоставьте минимальный воспроизводимый пример, который демонстрирует проблему.