JFormattedTextField 中的值未清除

Posted

技术标签:

【中文标题】JFormattedTextField 中的值未清除【英文标题】:Values not clearing in JFormattedTextField 【发布时间】:2012-08-03 06:15:29 【问题描述】:

我发现很难清除JFormattedTextFields 的值。怎么做?

我试过了

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. 可以用FormatterJFormattedTextField 设置null 值,但我建议为具体的Formatter 使用适当的值,例如对于NumberFormatter 设置setValue(0.00)

4.为了更好的帮助,请尽快发布SSCCE,否则您的问题可能无法回答,

【讨论】:

我发布了工厂。很抱歉没有添加 SSCCE。但我发现JFormattedTextField.setValue(null); 可以解决问题。谢谢【参考方案2】:

您所看到的行为的原因是 JFormattedTextField 恢复为 focusLostcommit 上的最后一个有效值。通常,您的代码应该使用 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 中的值未清除的主要内容,如果未能解决你的问题,请参考以下文章

可选类型 '()?' 的值未打开

从数据库中获取的值未显示

XCode 6 Beta 6 Beta 7 中的错误 - 可选类型的值未解包

选定的值未显示在文本字段选择中 - 材质 UI 反应组件

嵌套 Rails 表单中的动态值未更新

获得焦点时如何选择 JFormattedTextField 中的所有文本?