2011-12-26 3 views
5

value = 0.0005, min = 0.0, max = 1.0 및 step size = 0.0005 인 SpinnerNumberModel을 사용하여 JSpinner를 설정하려고합니다. 그러나 이러한 매개 변수가있는 회 전자를 만들면 매우 이상한 행동을 보입니다. 위쪽 화살표를 클릭 할 때마다 0.0005에서 0.0005로 증가하는 대신 값이 0으로 고정되어있는 것으로 보입니다.Java의 이상한 SpinnerNumberModel 동작

형식 문제가 아닌지 확인하기 위해 필자는 각 변경 이벤트. 물론 위 화살표를 클릭 할 때마다 회 전자가 클릭 된 횟수와 상관없이 콘솔에 0과 0.0005 값이 표시됩니다.

다음은 비교를 위해 잘 작동하는 값이 약간 다른 회 전자를 비롯하여이를 테스트하는 데 사용한 코드입니다.

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import java.awt.*; 

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(200, 80); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)); 
     final JSpinner spinner2 = new JSpinner(new SpinnerNumberModel(0.05, 0.0, 1.0, 0.05)); 
     panel.add(spinner1, BorderLayout.NORTH); 
     panel.add(spinner2, BorderLayout.SOUTH); 
     frame.add(panel); 
     spinner1.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner1: " + ((Number) spinner1.getValue()).doubleValue()); 
      } 
     }); 
     spinner2.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner2: " + ((Number) spinner2.getValue()).doubleValue()); 
      } 
     }); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

누구나 내게 설명 할 수 있습니까? spinner2는 의도 한대로 작동하지만 spinner1은 그렇지 않습니다.

감사합니다.

편집 : 스피너의 텍스트 필드의 서식이 저장된 값에 실제로 영향을 준다는 것을 지적한 Peter에게 감사드립니다. 첫 번째 회 전자가 의도 한대로 작동하도록하려면 다음 줄을 추가했습니다 : spinner1.setEditor(new JSpinner.NumberEditor(spinner1, "0.0000"));.

+0

감사를 오버라이드 (override)하는 수 있습니다. 처음으로 문제가 발생한 실제 프로젝트는 이보다 훨씬 복잡합니다. 여기에 게시 된 코드는 문제를 보여주는 매우 뼈없는 예제입니다. –

+0

좋아요, 저는 두 개의 스피너를 보유 할 JPanel을 포함하도록 예제를 편집했습니다. 불행히도, 나는 여전히 첫 회 전자에 대해 같은 결과를 얻는다. –

+0

JPanel을 사용했지만 문제가 여전히 남아 있습니다. 나는 (0.001, 0.0001)을 JSpinner 모델 (value, step) 및 (0.0001, 0.001)로 사용해 보았습니다. 둘 다 작동하지 않습니다. 하지만 (0.001, 0.001) 대신 작동합니다. 이것은 JSpinner의 정확성 제시 문제를 의미합니까? – xorange

답변

9

이 문제는 회 전자에서 사용하는 JFormattedTextField에서 발생합니다. 그 편집기에서 당신이 찾을 수 있습니다

public void commitEdit() throws ParseException { 
    AbstractFormatter format = getFormatter(); 

    if (format != null) { 
     setValue(format.stringToValue(getText()), false, true); 
    } 
} 

당신의 회 전자 디스플레이 0.0005 0.0로, 당신이 먼저 모델 0.0을 넣어 증가하고 0.0005로 증가 경우 이벤트가 실제로 캡처하지만 텍스트 필드는 0.0

을 본다

해결책은 스피너 텍스트 필드의 형식을 변경하는 것입니다.

당신은 편집자에게 입력을위한

final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)) { 
     @Override 
     protected JComponent createEditor(SpinnerModel model) 
     { 
     return new NumberEditor(this, "0.0000");//needed decimal format 
     } 
    }; 
+0

흥미 롭군요 ... 텍스트 필드의 형식에 관계없이 회 전자가 동일한 배정도 값을 유지한다고 가정했습니다. 감사! –

+0

감사합니다. 비슷한 목적으로 사용되는 추가 선을 포함하도록 질문을 편집했습니다. –