0

フレームに JSlider コンポーネントがあり、外部コンポーネント (時々新しい値を設定するメディア プレーヤー) によって常に更新されています。外部コンポーネントではなくスライダーを操作する場合にのみ、スライダーが stateChanged イベントを処理するようにします。

これを達成する方法はありますか?

4

1 に答える 1

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

}

これにより、「値」プロパティの変更を制御できます。ここでの問題は、設定されたすべてのメソッドがメソッドを通過するsetRangePropertiesことです。そのため、何を有効にするかを決定する必要があります。私の例では、それを制御しない唯一のメソッドはsetValueメソッドです。

コードでは、次のように呼び出す必要があります...

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

...

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

他の唯一の選択肢は、それ自体を拡張し、同様の方法でメソッドを直接JSliderオーバーライドすることですsetValue

于 2012-07-25T16:08:10.367 に答える