>我在初始化滑块时使用了下面的代码:
//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()
那么清楚。