Java Slider - 触发fireStateChanged()而不更改值?

时间:2012-10-05 09:35:22

标签: java swing event-handling jslider changelistener

初始化我的滑块时使用了以下代码:

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

现在我需要触发更改的事件以使valueLabel标签以正确的格式设置。

slider.setValue(curr); 

这不会触发更改的事件,我猜是因为值没有改变。一个简单的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);

(说实话,这听起来像是最好的解决方案)。

但只是想知道 - 有没有办法以另一种方式触发改变的事件?

1 个答案:

答案 0 :(得分:2)

stateChanged()的内容重构为一个单独的方法,比如说updateLabel()。从stateChanged()方法和初始化代码中调用该方法。

我同意,将值设置为某个任意值只是为了触发更改是错误的。

注意:您可以通过JSlider.fireStateChanged()手动触发更改,但是对于未来的代码维护者而言,这不仅仅是调用updateLabel()