2

我发誓这太奇怪了。我制作了一个 Spinner,使用具有当前日期、无限制和 Calendar.MINUTE 单位的新 SpinnerDateModel 设置模型。

正如文档中所说:

创建一个 SpinnerDateModel,它表示开始和结束之间的日期序列。nextValue 和 previousValue 方法通过按 calendarField 时间单位推进或反转当前日期值来计算序列的元素。start 和 end 参数可以为 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 ICT

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

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

值:1970 年 1 月 1 日星期四 18:06:00 ICT

4

2 回答 2

1

您正在修改附加到 Spinner 的编辑器使用的日期格式。看起来当您使用 HH:mm 格式时,其余字段都使用 epoch 进行初始化。如果您不更改日期编辑器使用的格式,它会按预期工作。

于 2012-12-06T11:18:47.057 回答
0

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

于 2012-12-06T11:18:30.253 回答