JFormattedTextField 中的值未清除
Posted
技术标签:
【中文标题】JFormattedTextField 中的值未清除【英文标题】:Values not clearing in JFormattedTextField 【发布时间】:2012-08-03 06:15:29 【问题描述】:我发现很难清除JFormattedTextField
s 的值。怎么做?
我试过了
txtJFormattedTextField.setText("");
但是当再次失去焦点时,我清除的值会出现。我阅读了有关此问题的 API。
我为日期字段创建 JTFormattedTextFields 的工厂如下 -
public static JFormattedTextField createDateField()
MaskFormatter maskFormatter = null;
try
maskFormatter = new MaskFormatter("##/##/####");
catch (ParseException e)
e.printStackTrace();
JFormattedTextField formattedTextField = new JFormattedTextField(
maskFormatter);
SwingHelper.installDateValidation((AbstractDocument) formattedTextField
.getDocument());
formattedTextField.setColumns(10);
return formattedTextField;
试过了
try
((JFormattedTextField) txtSigninDate).commitEdit();
catch (ParseException e)
e.printStackTrace();
结果是异常 - 下面是异常跟踪。
java.text.ParseException: stringToValue passed invalid value
at javax.swing.text.MaskFormatter.stringToValue(MaskFormatter.java:456)
at javax.swing.text.MaskFormatter.stringToValue(MaskFormatter.java:371)
at javax.swing.JFormattedTextField.commitEdit(JFormattedTextField.java:530)
at app.view.action.Authentication_Action.clearSigninFields(Authentication_Action.java:207)
at app.view.action.authentication.AuthenticationCommand.decorateSignout(AuthenticationCommand.java:285)
at app.view.action.authentication.AuthenticationCommand.executeSignin(AuthenticationCommand.java:122)
at app.view.action.Authentication_Action$2.actionPerformed(Authentication_Action.java:292)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
【问题讨论】:
【参考方案1】:1.取决于使用的Formatter
JFormattedTextField.setValue(0.00);
2.或MaskFormatter
JFormattedTextField.setValue(null);
3. 可以用Formatter
为JFormattedTextField
设置null
值,但我建议为具体的Formatter
使用适当的值,例如对于NumberFormatter
设置setValue(0.00)
4.为了更好的帮助,请尽快发布SSCCE,否则您的问题可能无法回答,
【讨论】:
我发布了工厂。很抱歉没有添加 SSCCE。但我发现JFormattedTextField.setValue(null);
可以解决问题。谢谢【参考方案2】:
您所看到的行为的原因是 JFormattedTextField
恢复为 focusLost
和 commit
上的最后一个有效值。通常,您的代码应该使用 value
的 getter 和 setter 与此类字段进行交互,而不是像常规的 JTextComponent
那样使用 text
。
所以解决方案是设置一个由格式化程序格式化为空字符串的值。
更多信息请咨询tutorial。
【讨论】:
【参考方案3】:JFormattedTextField 将返回使用格式化程序工厂时输入的旧值的原因是,当焦点从字段中丢失时,它会验证输入或缺少输入。
这个问题的答案很简单,可以在 java docs 网站上找到 在你的情况下,这就是它的工作原理
txtJFormattedTextField.setFocusLostBehavior(JFormattedTextField.PERSIST);
在创建文本字段后添加此行,当焦点丢失时,它将不再尝试验证输入,换句话说,即使字段“无效”也会保持字段的当前值
https://docs.oracle.com/javase/7/docs/api/javax/swing/JFormattedTextField.html
【讨论】:
欢迎来到 Stack Overflow。您会添加指向您提到的 java 文档的链接吗?【参考方案4】:尝试添加
formattedTextField.commitEdit();
设置文字后;
【讨论】:
海报指的是焦点行为,而不是以编程方式设置值。以上是关于JFormattedTextField 中的值未清除的主要内容,如果未能解决你的问题,请参考以下文章