我正在尝试使用SpinnerNumberModel设置JSpinner,其中value = 0.0005,min = 0.0,max = 1.0,step size = 0.0005。然而,当我使用这些参数创建一个微调器时,我观察到非常奇怪的行为。它不是从0.0005开始,并且每次单击向上箭头时增加0.0005,而是似乎停留在0。
为了确保这不仅仅是格式问题,我在每个更改事件后打印了微调器的值。毫无疑问,对于每个向上箭头的单击,控制台都显示值为0,然后是0.0005,无论微调器被单击多少次。
下面是我用来测试这个问题的代码,包括一个具有稍微不同值的微调器,可以用于比较目的。
为了确保这不仅仅是格式问题,我在每个更改事件后打印了微调器的值。毫无疑问,对于每个向上箭头的单击,控制台都显示值为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"));
。