Java 带喷丝头的JSpinner模型怪异行为

Java 带喷丝头的JSpinner模型怪异行为,java,swing,jspinner,Java,Swing,Jspinner,我发誓这太奇怪了。我制作了一个微调器,用新的微调器设置模型DateModel带有当前日期、无限制和Calendar.MINUTE单位 正如文件中所述: 创建一个SpinnerDateModel,该模型表示 开始和结束。nextValue和previousValue方法计算 通过提前或反转当前日期来创建序列的元素 calendarField时间单位的值。开始和结束参数可以为null,以指示范围没有上限或下限 这是我的代码: import java.text.SimpleDateFormat; im

我发誓这太奇怪了。我制作了一个微调器,用新的微调器设置模型DateModel带有当前日期、无限制和Calendar.MINUTE单位

正如文件中所述:

创建一个SpinnerDateModel,该模型表示 开始和结束。nextValue和previousValue方法计算 通过提前或反转当前日期来创建序列的元素 calendarField时间单位的值。开始和结束参数可以为null,以指示范围没有上限或下限

这是我的代码:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.DateFormatter;
import javax.swing.text.DefaultFormatterFactory;

public class JSpinnerTest {

    public JSpinnerTest() {
        initComponents();
    }

    private void initComponents() {
        JFrame frame = new JFrame("JSpinner Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JSpinner spinner = new JSpinner();
        spinner.setModel(new javax.swing.SpinnerDateModel(new Date(), null, null, Calendar.MINUTE));
        SimpleDateFormat format = new SimpleDateFormat("HH:mm");

        ((DefaultEditor) spinner.getEditor()).getTextField().setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(format)));


        System.out.println("ORIGINAL VALUE: " + spinner.getValue().toString());

        spinner.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("VALUE: " + ((JSpinner) e.getSource()).getValue().toString());
            }
        });

        frame.add(spinner);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JSpinnerTest();
            }
        });
    }
}
但每次我点击这个小箭头按钮,日期就会重置为1970年1月1日。为什么?

示例输出:

原值:2012年12月6日星期四17:06:13

价值:1970年1月1日星期四17:06:00

价值:1970年1月1日星期四17:06:00


值:Thu Jan 01 18:06:00 ICT 1970

如果您在日期格式中输入未发生这种情况的日期,“dd/mm/yy HH:mm”。我知道这不是你要问的,但我假设当你没有明确说明日期时,它默认不使用它们

您正在修改附加到微调器的编辑器所使用的日期格式。看起来,当您使用HH:mm格式时,其余字段都是用历元初始化的。如果您不更改日期编辑器使用的格式,它将按预期工作。

是的,当您将格式更改为常规格式时,它将工作。但它仍然只更改字符串的最左侧部分(突出显示其他部分时除外)。那么“calendarField时间单位”(最后一个参数)的用途是什么?我只想展示时间。我不明白为什么开发人员会编写代码来读取基于字符串的值?那太荒谬了!他们可以访问从构造函数设置的日期。我认为模型运行正常,编辑器在将HH:mm转换为日期时没有使用当前日期。您可能需要修改下游代码,以便仅使用微调器返回日期后的小时和分钟值。或者,如果您的下游代码需要完整日期,您可以创建新的日期并设置小时/分钟。我不这么认为,为什么我要设计一个可以访问原始日期实例的组件来依赖文本字段的字符串?如果是这样的话,那么我至少需要一个参数,可以设置该参数来指定可以通过微调器按钮更改日期的哪一部分。