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"));
.
감사를 오버라이드 (override)하는 수 있습니다. 처음으로 문제가 발생한 실제 프로젝트는 이보다 훨씬 복잡합니다. 여기에 게시 된 코드는 문제를 보여주는 매우 뼈없는 예제입니다. –
좋아요, 저는 두 개의 스피너를 보유 할 JPanel을 포함하도록 예제를 편집했습니다. 불행히도, 나는 여전히 첫 회 전자에 대해 같은 결과를 얻는다. –
JPanel을 사용했지만 문제가 여전히 남아 있습니다. 나는 (0.001, 0.0001)을 JSpinner 모델 (value, step) 및 (0.0001, 0.001)로 사용해 보았습니다. 둘 다 작동하지 않습니다. 하지만 (0.001, 0.001) 대신 작동합니다. 이것은 JSpinner의 정확성 제시 문제를 의미합니까? – xorange