离开焦点后,JFormattedTextField日期发生变化

时间:2018-03-28 07:09:51

标签: java swing date format jformattedtextfield

我尝试处理与我的JFormattedTextFields相关的问题。我需要其中两个用于小型数据库项目。一个人必须显示一个日期,另一个必须显示货币值。

货币值字段的运行没有任何问题。只要输入中没有字母并且货币符号位于输入的末尾(€/ $),就可以输入格式。这是我的代码:

    NumberFormat nf = NumberFormat.getCurrencyInstance();
    NumberFormatter nff = new NumberFormatter(nf);
    DefaultFormatterFactory currencyfactory = new DefaultFormatterFactory(nff);
    formattedTextField2.setFormatterFactory(currencyfactory);
    formattedTextField2.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
    formattedTextField2.setValue(00.00);

如果我对我的日期字段尝试相同,结果有点令人困惑。这是我的日期字段代码:

    DateFormat df = new SimpleDateFormat("dd.MM.YYYY");
    DateFormatter dateFormatter = new DateFormatter(df);
    DefaultFormatterFactory datefactory = new DefaultFormatterFactory(dateFormatter);
    formattedTextField1.setFormatterFactory(datefactory);
    formattedTextField1.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
    formattedTextField1.setValue(new Date());

当我开始我的测试程序时,今天的日期被写入formattedtextfield,例如28.03.2018。如果我将值更改为28.03.2017并保留字段(使用TAB或在表单上选择其他字段),则值将更改为02.01.2017。

我试过的其他例子:

22.10.2015 - > 2015年12月29日

25.04.2012 - > 2012年1月2日

19.09.1993 - > 1993年4月1日

我不明白这种行为。通常,带有COMMIT_OR_REVERT的 setFocusLostBehavior 应检查用户输入/字段值是否为有效值,具体取决于特定的formattedtextfield及其工厂的格式。否则,它应该将值重置为最后一个有效输入/值。

有人给我这个小费吗?

编辑:

public class formattedtextfield {
private JPanel panel_main;
private JFormattedTextField formattedTextField1;
private JFormattedTextField formattedTextField2;

public formattedtextfield() {
    DateFormat df = new SimpleDateFormat("dd.MM.YYYY");
    DateFormatter dateFormatter = new DateFormatter(df);
    DefaultFormatterFactory datefactory = new DefaultFormatterFactory(dateFormatter);
    formattedTextField1.setFormatterFactory(datefactory);
    formattedTextField1.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
    formattedTextField1.setValue(new Date());

    NumberFormat nf = NumberFormat.getCurrencyInstance();
    NumberFormatter nff = new NumberFormatter(nf);
    DefaultFormatterFactory currencyfactory = new DefaultFormatterFactory(nff);
    formattedTextField2.setFormatterFactory(currencyfactory);
    formattedTextField2.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
    formattedTextField2.setValue(00.00);
}

public static void main(String[] args) {
    JFrame frame = new JFrame("formattedtextfield");
    frame.setContentPane(new formattedtextfield().panel_main);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
}

}

这是我的整个小测试程序,包含一个表单和两个formattexts。

EDIT2: 我找到了解决方案!这只是SimpleDateFormat的一个小错字。我将模式设置为" dd.MM.YYYY"但它必须是" dd.MM.yyyy"。导致问题的是小写字母Y.神圣的moly ..无论如何,感谢您阅读和评论:)

不起作用:

DateFormat df = new SimpleDateFormat("dd.MM.YYYY");

工作:

DateFormat df = new SimpleDateFormat("dd.MM.yyyy");

0 个答案:

没有答案