Java中的奇数SpinnerNumberModel行为
我正在尝试使用值为0.0005、最小值为0.0、最大值为1.0、步长为0.0005的SpinnerNumberModel设置JSpinner。但是,当我使用这些参数创建微调器时,我观察到非常奇怪的行为。与从0.0005开始,每次单击向上箭头都增加0.0005不同,该值似乎一直保持在0 为了确保这不仅仅是一个格式问题,我在每次更改事件后打印了微调器的值。毫无疑问,对于向上箭头的每次单击,控制台都会将值显示为0,然后显示为0.0005,而不管微调器被单击了多少次 下面是我用来测试这一点的代码,包括一个微调器,它的值略有不同,可以很好地进行比较Java中的奇数SpinnerNumberModel行为,java,swing,jspinner,Java,Swing,Jspinner,我正在尝试使用值为0.0005、最小值为0.0、最大值为1.0、步长为0.0005的SpinnerNumberModel设置JSpinner。但是,当我使用这些参数创建微调器时,我观察到非常奇怪的行为。与从0.0005开始,每次单击向上箭头都增加0.0005不同,该值似乎一直保持在0 为了确保这不仅仅是一个格式问题,我在每次更改事件后打印了微调器的值。毫无疑问,对于向上箭头的每次单击,控制台都会将值显示为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);
}
}
有人能向我解释为什么喷丝头2能按预期工作,而喷丝头1不能
谢谢
编辑:感谢Peter指出微调器文本字段的格式实际上对存储值有影响。为了让第一个微调器按预期工作,我添加了一行:
spinner1.setEditor(新的JSpinner.NumberEditor(spinner1,“0.0000”)代码>问题在于微调器使用的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
}
};
谢谢你的意见。我第一次遇到这个问题的实际项目要比这个复杂得多。我在这里发布的代码是一个非常简单的示例,演示了这个问题。好的,我已经编辑了这个示例,其中包括一个JPanel来容纳两个微调器。不幸的是,对于第一个微调器,我仍然得到同样不可靠的结果。我使用了JPanel,但问题仍然存在。我尝试使用(0.001,0.0001)作为JSpinner模型(值,步长)和(0.0001,0.001)。两者都不起作用。但是(0.001,0.001)起作用。这是否意味着JSpinner的准确性存在问题?很有趣。。。我假设微调器保持相同的双精度值,不管文本字段如何格式化。谢谢谢谢你,彼得。我对我的问题进行了编辑,添加了一行类似的内容。