初始化我的滑块时使用了以下代码:
//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);
(说实话,这听起来像是最好的解决方案)。
但只是想知道 - 有没有办法以另一种方式触发改变的事件?
答案 0 :(得分:2)
将stateChanged()
的内容重构为一个单独的方法,比如说updateLabel()
。从stateChanged()
方法和初始化代码中调用该方法。
我同意,将值设置为某个任意值只是为了触发更改是错误的。
注意:您可以通过JSlider.fireStateChanged()
手动触发更改,但是对于未来的代码维护者而言,这不仅仅是调用updateLabel()
。