2012-10-05 49 views
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); 

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

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

回答

2

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

我同意,这将是错误的值设置为一些任意值,只是触发的变化。

注意:您可以通过JSlider.fireStateChanged()手动触发更改,但对于未来的代码维护人员来说,这比简单地调用updateLabel()更不明显。

+0

+1更快的正确答案:-) – kleopatra

+0

叫我挑剔,但你不能在方法内部创建一个方法直截了当一样,在Java。 我可以做[运行的伎俩(http://www.velocityreviews.com/forums/t373066-why-i-cannot-have-a-method-inside-another-method.html)。这将是有用的 - 但看起来比3行重复代码更混乱。 或者我可以在这个方法之外创建一个私有方法,并且传入标签和值,但是我对这个代码混乱感到棘手吗? – dwjohnston

+2

@ user1068446谁说一个方法在方法?滑块值和标签文本之间的绑定(基本上就是你在做什么)属于_somewhere_ - 只有在最简单的上下文中,这个地方可以是单个的监听器(你的ChangeListener),甚至你自己也不是(你需要它两次)。所以它必须转移到所有需要它的合作者可以访问的地方,f.i.作为视图类的一种方法(用于简单的上下文)。下一步是提取某种业务模型,该模型具有一个值并将标签和滑块绑定到该值。 – kleopatra

相关问题