我尝试处理与我的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");