フレームに JSlider コンポーネントがあり、外部コンポーネント (時々新しい値を設定するメディア プレーヤー) によって常に更新されています。外部コンポーネントではなくスライダーを操作する場合にのみ、スライダーが stateChanged イベントを処理するようにします。
これを達成する方法はありますか?
独自の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);
}
}
}
これにより、「値」プロパティの変更を制御できます。ここでの問題は、設定されたすべてのメソッドがメソッドを通過するsetRangeProperties
ことです。そのため、何を有効にするかを決定する必要があります。私の例では、それを制御しない唯一のメソッドはsetValue
メソッドです。
コードでは、次のように呼び出す必要があります...
MyBoundedRangeModel boundedRangeModel = new MyBoundedRangeModel();
slider.setModel(boundedRangeModel);
...
boundedRangeModel.setUpdatesAllowed(true);
slider.setValue(value);
boundedRangeModel.setUpdatesAllowed(false);
他の唯一の選択肢は、それ自体を拡張し、同様の方法でメソッドを直接JSlider
オーバーライドすることですsetValue