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



>我在初始化滑块时使用了下面的代码:

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

这不会触发更改的事件,我猜是因为值没有更改。一个简单的黑客修复是只做这样的事情:

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

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

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

> 将stateChanged()的内容重构为单独的方法,例如updateLabel()。从 stateChanged() 方法和初始化代码调用该方法。

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

注意:您可以通过 JSlider.fireStateChanged() 手动触发更改,但是对于未来的代码维护者来说,这仍然不如简单地调用 updateLabel() 那么清楚。

相关内容

  • 没有找到相关文章

最新更新