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);

(Что звучит как лучшее решение здесь, если честно).

Но просто интересно - есть ли способ вызвать измененное событие другим способом?


person dwjohnston    schedule 05.10.2012    source источник


Ответы (1)


Рефакторинг содержимого stateChanged() в отдельный метод, скажем, updateLabel(). Вызовите этот метод как из метода stateChanged(), так и из вашего кода инициализации.

Я согласен, было бы неправильно установить какое-то произвольное значение только для того, чтобы вызвать изменение.

Примечание: вы можете инициировать изменение вручную с помощью JSlider.fireStateChanged(), однако это все еще менее понятно для будущего специалиста по сопровождению кода, чем простой вызов updateLabel().

person Duncan Jones    schedule 05.10.2012
comment
Назовите меня привередливым, но вы не можете создать метод внутри метода прямо, как в java. Я могу выполнить работающий трюк. Что было бы полезно, но выглядит более запутанно, чем 3 строки повторяющегося кода. Или я мог бы создать закрытый метод вне этого метода и передать метку и значение, но меня это не устраивает - беспорядок в коде? - person dwjohnston; 05.10.2012
comment
@ user1068446, кто сказал что-нибудь о методе в методе? Связывание между значением ползунка и текстом метки (в основном это то, что вы делаете) принадлежит где-то — это место может быть единственным слушателем (вашим ChangeListener) только в самых упрощенных контекстах, которых нет даже у вас ( нужно дважды). Поэтому он должен быть перемещен туда, где он доступен для всех соавторов, которым он нужен, т.е. как метод класса представления (для простых контекстов). Следующим шагом является извлечение какой-либо бизнес-модели, которая имеет значение, и привязка ярлыка и ползунка к этому значению. - person kleopatra; 05.10.2012
comment
@mKorbel спасибо, но тогда мне нужно было бы добавить несколько фрагментов кода ... что в настоящее время не привлекательно :-) - person kleopatra; 05.10.2012