【问题标题】:JSlider -- differentiate between setValue() and user inputJSlider——区分 setValue() 和用户输入
【发布时间】:2020-02-26 15:50:37
【问题描述】:

我正在尝试基于 MediaPlayer 的播放头(来自另一个设置静态 JSlider 值的类)的 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() 在用户更改滑块时为真,以及在滑块递增时也是如此。这意味着我无法将剪辑调整到用户指定的时间,并且当我释放它时滑块会简单地跳回其原始位置。

有什么方法可以区分方法何时改变滑块和用户何时改变?

【问题讨论】:

  • 我最好使用JProgressBarMouseListener..

标签: java swing jslider


【解决方案1】:

保留一个指示程序更改的私有字段:

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2020-01-09
    • 2022-06-13
    相关资源
    最近更新 更多