具有JFormattedTextField的DateFormatter如何仅键入有效日期

时间:2014-09-10 11:10:14

标签: java swing simpledateformat jformattedtextfield

我想让JFormattedTextField仅从键盘中获取有效数字。如果我选择日期格式“dd-mm-yyyy”,当我开始输入时,我只能获得0,1,2或3作为日期数字的第一个数字。我下面的代码,不仅没有这样做,而且它允许我输入任何内容,而不必费心地输入“ - ”字符。但是,在失去焦点时,键入的日期会消失,除非它是有效的格式(这也意味着我需要自己输入“ - ”。

我的问题是:我是否可以通过简单的方式修改此代码,而无需添加新的MaskedFormatters或编写一些输入验证程序,这样我只能以正确的格式输入日期而不需要其他任何内容,而不必输入“ - ”字符?

正如我在其他帖子中看到的那样,很多人建议使用JSpinners而不是这个,但只有当我无法使用JFormattedTextField做我想做的事情时,我才会想到这一点。

这是子类JFormattedTextField

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

    public class RomDateField extends JFormattedTextField{

        public RomDateField(){

        super();

        SimpleDateFormat sdf=new SimpleDateFormat("dd-mm-yyyy");
        sdf.setLenient(false);
        DateFormatter df=new DateFormatter(sdf);
        //df.setAllowsInvalid(false); //with this you can't type at all
        df.setOverwriteMode(true);
        df.setCommitsOnValidEdit(true);
        setFormatterFactory(new DefaultFormatterFactory(df));
        }
    }

和主要课程:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.util.*;

    public class TestDates{

        JLabel jl=new JLabel("Date:");
        JFrame jf=new JFrame("Test DateFormatter with JFormattedTextField");
        RomDateField jtf=new RomDateField();
        JButton jb=new JButton("Lose Focus");
        JPanel pane=new JPanel();

        public TestDates(){

            jf.setLocationRelativeTo(null);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pane.add(jl);
            jtf.setColumns(20);
            pane.add(jtf);
            pane.add(jb);

            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();
                }
            });
        }
    }

0 个答案:

没有答案