JSlider - различать setValue () и пользовательский ввод - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь получить JSlider, который увеличивается каждую секунду или около того, в зависимости от точки воспроизведения MediaPlayer (из другого класса, который устанавливает значение stati c JSlider). Например,

Window.timeSlider/*static JSlider from other class*/.setValue(/*int current progress of the audio clip*/);

Действует как временная шкала для аудиофайла. Это вызывает это примерно каждую секунду. Тем не менее, я хочу отдельно определить пользовательский ввод - когда пользователь перетаскивает ползунок вручную - из дополнительных изменений, выполняемых из другого класса. Я столкнулся с этой проблемой, когда пытался использовать прослушиватель действий для ползунка:

public void stateChanged(ChangeEvent e) {
    if (e.getSource() == timeSlider) {
        JSlider src = (JSlider)e.getSource();

        if (!src.getValueIsAdjusting()) {
            timeSliderChanged = true;
        }
    }
}

Проблема в том, что getValueIsAdjusting () имеет значение true, когда пользователь изменяет ползунок, и когда ползунок увеличивается. Это означает, что я не могу настроить клип на указанное пользователем время, и ползунок просто возвращается к исходному положению, когда я его отпускаю.

Любой способ различить guish, когда метод меняется ползунок и когда пользователь?

1 Ответ

1 голос
/ 26 февраля 2020

Оставьте приватное поле, которое указывает изменение программы c:

private boolean programmaticallyChangingSlider;

// ...

    programmaticallyChangingSlider = true;

    slider.setValue(newValue);

    EventQueue.invokeLater(
        () -> { programmaticallyChangingSlider = false; });

Затем ChangeListener может проверить это поле:

public void stateChanged(ChangeEvent e) {
    if (e.getSource() == timeSlider) {
        if (!programmaticallyChangingSlider) {
            // Respond to user input here
        }
    }
}
...