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