JFormattedTextField中严格的24小时时间

我正在尝试创建一个只接受24小时时间的JFormattedTextField。

我非常接近解决方案,但有一个案例,下面的代码示例不起作用。

如果输入时间“222”并从字段中更改焦点,则时间将更正为“2202”。 我希望它只接受一个完整的4位数24小时时间。 除了我刚才提到的那个代码之外,这个代码在几乎所有情况下都可以正常工作。 有什么建议么?

public static void main(String[] args) throws ParseException { DateFormat dateFormat = new SimpleDateFormat("HHmm"); dateFormat.setLenient(false); DateFormatter dateFormatter = new DateFormatter(dateFormat); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFormattedTextField textField = new JFormattedTextField(dateFormatter); frame.add(textField, BorderLayout.NORTH); frame.add(new JTextField("This is here so you can change focus."), BorderLayout.SOUTH); frame.setSize(250, 100); frame.setVisible(true); } 

正如其他人所提到的,你最好的选择可能是validation输入字符串的长度。 我首选的方法是将SimpleDateFormat子类化,以便将所有解析逻辑保存在一个地方:

 public class LengthCheckingDateFormat extends SimpleDateFormat { public LengthCheckingDateFormat(String pattern) { super(pattern); } @Override public Date parse(String s, ParsePosition p) { if (s == null || (s.length() - p.getIndex()) < toPattern().length()) { p.setErrorIndex(p.getIndex()); return null; } return super.parse(s, p); } } 

我想知道,因为DateFormatter似乎做了“差不多”的所有技巧。

因此,为什么不覆盖其进行最终validation和格式化的方法,以处理所有输入的太短的空String

  DateFormatter dateFormatter = new DateFormatter(dateFormat) { @Override public Object stringToValue(String text) throws ParseException { if(!getFormattedTextField().hasFocus()) if (text.length() != 4) { return null; } return super.stringToValue(text); } }; 

编辑:

正如@nIcE cOw所建议的那样,最简单的方法就是在焦点丢失时服务它:

  final JFormattedTextField textField = new JFormattedTextField(dateFormatter); textField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { super.focusLost(e); if(textField.getText().length() != 4) textField.setText(""); } });