1

スライダーを初期化するときに、以下のコードを使用しました。

//Gets the corresponding slider value, from it's represented value. 
int curr = valueToSlider(min, max, current, scale, q, grains); 

final JSlider slider = new JSlider(JSlider.VERTICAL, 0, grains, curr);

slider.addChangeListener(new ChangeListener() {

  public void stateChanged(ChangeEvent event) {
    double value = sliderToValue(min, max, slider.getValue(), scale, q, grains); 
    String str = ""; 

    if (valueType == SliderValueType.FLOAT) 
       str = String.format("%.2f",value);
    if (valueType == SliderValueType.INTEGER) 
       str = String.format("%.0f", value); 

    valueLabel.setText(str); 
    callCommand(c, value);
  }
});

ここで、changed イベントをトリガーして、その valueLabel ラベルを正しい形式で設定する必要があります。

slider.setValue(curr); 

それは変更されたイベントをトリガーしません。値が変更されていないためだと思います。簡単なハッキーな修正は、次のようにすることです。

slider.setValue(1);
slider.setValue(curr);

しかし、一部のコードでは、変更されたイベントをランダムな値でトリガーすると、望ましくない結果が生じる可能性があることが想像できます。

setText初期化メソッドでそのメソッドを再現できました。

if (valueType == SliderValueType.FLOAT) 
   str = String.format("%.2f",curr);

if (valueType == SliderValueType.INTEGER) 
   str = String.format("%.0f", curr); 

valueLabel.setText(str);

(正直に言うと、これが最善の解決策のように思えます)。

しかし、疑問に思っているのは、変更されたイベントを別の方法でトリガーする方法はありますか?

4

1 に答える 1

2

stateChanged()の内容を別のメソッドにリファクタリングしますupdateLabel()stateChanged()メソッドと初期化コードの両方からそのメソッドを呼び出します。

変更をトリガーするためだけに値を任意の値に設定するのは間違っていることに同意します。

注: を介して手動で変更をトリガーすることもできますがJSlider.fireStateChanged()、将来のコード管理者にとっては、単純に を呼び出すよりも明確ではありませんupdateLabel()

于 2012-10-05T09:44:09.847 に答える