使用SpinDateModel处理JSpinner中的日期格式

Mag*_*won 2 java swing jspinner

我有以下几行代码:

    SpinnerDateModel spinMod=new SpinnerDateModel();
    JSpinner spin=new JSpinner(spinMod);
    //spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
Run Code Online (Sandbox Code Playgroud)

当显示微调框时,我可以对其进行编辑,并在月份字段中输入我想要的任何两位数字。

如果单击JSpinner侧面,则只能增加和减少月份或日期的数字,以便它们的值合法。但是,如果我添加了最后注释过的行,那么这也不起作用。

问题是如何使JSpinner自定义格式仅接受合法日期。

另外,如果我ActionListener添加了一个获取日期的按钮,则可以通过将getValue()直接应用于来获得“正确的日期” JSpinner,但是如果我将日期编辑器的格式应用于该值,则会得到一个错误的日期(输入的日期)从中获得JSpinner。我希望动作监听器以我的自定义格式获取正确的值,并且我JSpinner只希望接受自定义格式的输入。那可能吗?

我的测试代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.text.*; //for the date format

public class TestDates{

    JLabel jl=new JLabel("Date:");
    JFrame jf=new JFrame("Test SpinnerDateFormat");

    JButton jb=new JButton("Get Date");
    SpinnerDateModel spinMod=new SpinnerDateModel();
    JSpinner spin=new JSpinner(spinMod);

    class jbHandler implements ActionListener{
        public void actionPerformed(ActionEvent evt){
            JSpinner.DateEditor de=(JSpinner.DateEditor)spin.getEditor();
            String wrongDate=de.getFormat().format(spin.getValue());
            Date okDate=(Date)spin.getValue();
            System.out.println(">>>\n"+wrongDate+"\n"+okDate);
        }
    }

    JPanel pane=new JPanel();

    public TestDates(){

        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        pane.add(jl);

        jb.addActionListener(new jbHandler());
        pane.add(jb);

        spin.setValue(new Date());//this doesn't work properly with the custom format
        spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
        pane.add(spin);

        jf.add(pane);
        jf.pack();
        jf.setVisible(true);
    }

    public static void main(String[] args){

    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            TestDates tdate=new TestDates();
        }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

dic*_*c19 5

如果单击JSpinner一侧,则只能增加和减少月份或日期的数字,以便它们的值合法。但是,如果我添加了最后注释过的行,那么这也不起作用。

问题是您在此行的日期模式中有一点(但很常见)错误:

spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
Run Code Online (Sandbox Code Playgroud)

在此模式中,“ mm”是指分钟而不是几个月,因此导致不同的输出。正确的模式是:

spin.setEditor(new JSpinner.DateEditor(spin,"dd.MM.yyyy"));
Run Code Online (Sandbox Code Playgroud)

问题是如何使JSpinner仅接受具有自定义格式的合法日期。

如果要防止用户键入无效日期,则需要使用编辑器的格式化程序并禁止无效输入。请参见以下代码段:

SpinnerDateModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner(model);

JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "dd.MM.yyyy");
DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
formatter.setAllowsInvalid(false); // this makes what you want
formatter.setOverwriteMode(true);
Run Code Online (Sandbox Code Playgroud)

自定义日期时间格式

请参阅定制格式轨迹。

另请参见从SimpleDateFormat javadoc的“ 日期和时间模式”部分中提取的下表:

在此处输入图片说明