Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的奇数SpinnerNumberModel行为_Java_Swing_Jspinner - Fatal编程技术网

Java中的奇数SpinnerNumberModel行为

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,而不管微调器被单击了多少次 下面是我用来测试这一点的代码,包括一

我正在尝试使用值为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的准确性存在问题?很有趣。。。我假设微调器保持相同的双精度值,不管文本字段如何格式化。谢谢谢谢你,彼得。我对我的问题进行了编辑,添加了一行类似的内容。