2012-10-05 76 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

相關問題