나는 나의 슬라이더를 초기화하는 경우 아래의 코드를 사용 : Java 슬라이더 - 값을 변경하지 않고 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 에서처럼 메소드 내에서 메소드를 생성 할 수 없습니다. [runnable trick]을 할 수 있습니다 (http://www.velocityreviews.com/forums/t373066-why-i-cannot-have-a-method-inside-another-method.html). 어떤 것이 유용할까요?하지만 3 줄의 반복 코드보다 혼란스러워 보입니다. 또는이 메서드 외부에서 private 메서드를 만들고 레이블과 값을 전달할 수는 있지만 코드 혼란에 대해 불만이들 것입니까? – dwjohnston
@ user1068446 누가 메소드 - 인 - 어 - 메쏘드에 대해 말했습니까? 슬라이더 값과 레이블 텍스트 사이의 바인딩 (기본적으로 사용자가 수행하는 작업)은 _somewhere_에 속합니다. 가장 단순한 컨텍스트에서만 단일 리스너 (ChangeListener)가 될 수 있습니다. 두 번 필요하지는 않습니다 (두 번 필요합니다). 따라서 필요한 모든 공동 작업자가 액세스 할 수있는 곳으로 이동해야합니다 (f.i. 뷰 클래스의 메소드 (간단한 컨텍스트의 경우). 다음 단계는 가치가있는 일종의 비즈니스 모델을 추출하여 레이블과 슬라이더를이 값으로 바인딩합니다. – kleopatra