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