我的框架上有一个JSlider组件,它由外部组件(一个不时设置新值的媒体播放器)不断更新。我希望滑块只在我操纵滑块而不是我的外部组件时才处理stateChanged事件。
有没有办法实现这个目标?
答案 0 :(得分: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);
}
}
}
这将允许您控制“value”属性的更改。你在这里遇到的问题是所有设置方法都经过setRangeProperties
方法,所以你需要决定应该允许什么来实现它。在我的示例中,唯一不控制它的方法是setValue
方法。
在您的代码中,您需要将其称为......
MyBoundedRangeModel boundedRangeModel = new MyBoundedRangeModel();
slider.setModel(boundedRangeModel);
...
boundedRangeModel.setUpdatesAllowed(true);
slider.setValue(value);
boundedRangeModel.setUpdatesAllowed(false);
您唯一的另一个选择是扩展JSlider
本身并以类似的方式直接覆盖setValue
方法