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

这不会触发 changed 事件,我猜是因为值没有改变。一个简单的 hacky 解决方法是执行以下操作:

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 回答