2012-10-05 5 views
1

나는 나의 슬라이더를 초기화하는 경우 아래의 코드를 사용 : 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); 

(솔직히 말해서 가장 좋은 해결책 인 것 같습니다.)

하지만 궁금한 점은 변경된 이벤트를 다른 방식으로 트리거하는 방법이 있습니까?

답변

2

stateChanged()의 내용을 별도의 방법, 즉 updateLabel()으로 리 팩터하십시오. stateChanged() 메서드와 초기화 코드에서 해당 메서드를 호출합니다.

나는 동의한다. 변경을 유발하기 위해 값을 임의의 값으로 설정하는 것은 잘못된 것이다.

참고 : 수동으로 JSlider.fireStateChanged()을 통해 변경 사항을 트리거 할 수 있습니다. 단, 나중에 코드 관리자 인 updateLabel()을 호출하는 것보다 명확하지 않습니다.

+0

+1 더 빠른 정답 :-) – kleopatra

+0

전화가 까다 롭지 만, 곧바로 java 에서처럼 메소드 내에서 메소드를 생성 할 수 없습니다. [runnable trick]을 할 수 있습니다 (http://www.velocityreviews.com/forums/t373066-why-i-cannot-have-a-method-inside-another-method.html). 어떤 것이 유용할까요?하지만 3 줄의 반복 코드보다 혼란스러워 보입니다. 또는이 메서드 외부에서 private 메서드를 만들고 레이블과 값을 전달할 수는 있지만 코드 혼란에 대해 불만이들 것입니까? – dwjohnston

+2

@ user1068446 누가 메소드 - 인 - 어 - 메쏘드에 대해 말했습니까? 슬라이더 값과 레이블 텍스트 사이의 바인딩 (기본적으로 사용자가 수행하는 작업)은 _somewhere_에 속합니다. 가장 단순한 컨텍스트에서만 단일 리스너 (ChangeListener)가 될 수 있습니다. 두 번 필요하지는 않습니다 (두 번 필요합니다). 따라서 필요한 모든 공동 작업자가 액세스 할 수있는 곳으로 이동해야합니다 (f.i. 뷰 클래스의 메소드 (간단한 컨텍스트의 경우). 다음 단계는 가치가있는 일종의 비즈니스 모델을 추출하여 레이블과 슬라이더를이 값으로 바인딩합니다. – kleopatra