【问题标题】:JSlider with 2 data sources event handling具有 2 个数据源事件处理的 JSlider
【发布时间】:2012-07-25 10:33:25
【问题描述】:

我的框架上有一个 JSlider 组件,该组件由外部组件(不时设置新值的媒体播放器)不断更新。我希望滑块仅在我操作滑块而不是我的外部组件时处理 stateChanged 事件。

有什么方法可以实现吗?

【问题讨论】:

  • 您可以改用JProgressBar

标签: java swing events jslider


【解决方案1】:

我会实现我自己的BoundedRangeModel,这样你就可以添加额外的标志来表明它是否应该接受更新

示例更新

基本思想是实现您自己的模型,这样您就可以控制值何时实际更改

public class MyBoundedRangeModel extends DefaultBoundedRangeModel {

    private boolean updatesAllowed;

    public void setUpdatesAllowed(boolean updatesAllowed) {
        this.updatesAllowed = updatesAllowed;
    }

    public boolean isUpdatesAllowed() {
        return updatesAllowed;
    }

    @Override
    public void setMinimum(int n) {
        setUpdatesAllowed(true);
        super.setMinimum(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setMaximum(int n) {
        setUpdatesAllowed(true);
        super.setMaximum(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setExtent(int n) {
        setUpdatesAllowed(true);
        super.setExtent(n);
        setUpdatesAllowed(false);
    }

    @Override
    public void setValue(int n) {
        super.setValue(n);
    }

    @Override
    public void setValueIsAdjusting(boolean b) {
        setUpdatesAllowed(true);
        super.setValueIsAdjusting(b);
        setUpdatesAllowed(false);
    }

    @Override
    public void setRangeProperties(int newValue, int newExtent, int newMin, int newMax, boolean adjusting) {        
        if (isUpdatesAllowed()) {
            super.setRangeProperties(newValue, newExtent, newMin, newMax, adjusting);
        }
    }

}

这将允许您控制“值”属性的更改。你在这里遇到的问题是所有的 set 方法都通过setRangeProperties 方法,所以你需要决定应该允许什么来影响它。在我的示例中,唯一无法控制它的方法是 setValue 方法。

在您的代码中,您需要将其称为...

MyBoundedRangeModel boundedRangeModel = new MyBoundedRangeModel();
slider.setModel(boundedRangeModel);

...

boundedRangeModel.setUpdatesAllowed(true);
slider.setValue(value);
boundedRangeModel.setUpdatesAllowed(false);

您唯一的其他选择是扩展JSlider 本身并以类似的方式直接覆盖setValue 方法

【讨论】:

  • 当我从内部组件更新滑块时,我需要以某种方式禁用“stateChanged”事件。有没有像 .NET 这样的处理方法?
  • 不在StateChanged事件中
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 2013-02-02
  • 2014-05-27
  • 1970-01-01
  • 2020-01-27
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多