1
我使用的代码初始化我的滑块时,如下所示: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);
(这听起来像是最好的解决方案在这里说实话)。
但只是想知道 - 有触发更改事件另一种方式的方法吗?
+1更快的正确答案:-) – kleopatra
叫我挑剔,但你不能在方法内部创建一个方法直截了当一样,在Java。 我可以做[运行的伎俩(http://www.velocityreviews.com/forums/t373066-why-i-cannot-have-a-method-inside-another-method.html)。这将是有用的 - 但看起来比3行重复代码更混乱。 或者我可以在这个方法之外创建一个私有方法,并且传入标签和值,但是我对这个代码混乱感到棘手吗? – dwjohnston
@ user1068446谁说一个方法在方法?滑块值和标签文本之间的绑定(基本上就是你在做什么)属于_somewhere_ - 只有在最简单的上下文中,这个地方可以是单个的监听器(你的ChangeListener),甚至你自己也不是(你需要它两次)。所以它必须转移到所有需要它的合作者可以访问的地方,f.i.作为视图类的一种方法(用于简单的上下文)。下一步是提取某种业务模型,该模型具有一个值并将标签和滑块绑定到该值。 – kleopatra