清除 JFormattedTextField 的内容不起作用?

Posted

技术标签:

【中文标题】清除 JFormattedTextField 的内容不起作用?【英文标题】:Clearing contents of JFormattedTextField not working? 【发布时间】:2015-10-30 11:05:52 【问题描述】:

    我有一个JFormattedTextField,它只接受 8 位数字,但是当我尝试使用退格按钮清除文本字段时,它不会删除数字的第一个字符(删除按钮的行为也相同),我必须预先看到 Esc 键每次都删除这个字符。

    NumberFormat intFormat = NumberFormat.getIntegerInstance();
    intFormat.setGroupingUsed(false);
    NumberFormatter numberFormatter = new NumberFormatter(intFormat);
    numberFormatter.setValueClass(Integer.class); 
    numberFormatter.setAllowsInvalid(false);
    numberFormatter.setMinimum(0);
    numberFormatter.setMaximum(99999999);
    
    releaseNoTextField = new JFormattedTextField(numberFormatter);
    

这里有什么问题?

    使用releaseNoTextField.setText("") 清除此文本字段也不起作用,还有其他方法吗?

【问题讨论】:

“同样用 releaseNoTextField.setText("") 清除这个文本字段也不起作用,还有其他方法吗?” - 你试过setValue(null)吗? is not working是什么意思? 我“认为”JFormattedTextFieldNumberFormatterNumberFormat 之间的要求是 "" 不是有效数字,因此它拒绝您删除最后一个字符的尝试。 numberFormatter.setAllowsInvalid 强制执行此要求。如果您并不真正关心值的格式,而只是限制用户的输入,则可以使用 JTextFieldDocumentFilter @MadProgrammer 有什么方法可以在用户离开字段并清除文本后提示错误? 如果您使用setAllowsInvalid(true),则应在用户离开该字段后重置该字段。通常,我会使用InputVerifier,但我不确定这是否适合JFormattedTextField 【参考方案1】:

我有一个只接受 8 位数字的 JFormattedTextField,但是当我尝试使用退格按钮清除文本字段时,它不会删除数字的第一个字符(删除按钮的行为也相同),我必须预先看到 Esc 键才能删除每次都是这个角色。

这是numberFormatter.setAllowsInvalid(false); 应用的限制,它将空白String ("") 视为无效数值。如果您使用numberFormatter.setAllowsInvalid(true);,您可以删除所有字符,但您也可以输入任何您喜欢的值。

该字段将在用户离开该字段后进行验证。

如果您不关心已格式化的值 (12, 345, 678),那么您可以使用 DocumentFilter 应用于普通的 JTextField 并在其中实现您需要的逻辑。有关详细信息,请参阅 Implementing a Document Filter 和 DocumentFilter Examples。

同样使用 releaseNoTextField.setText("") 清除此文本字段也不起作用,还有其他方法吗?

您应该(始终)使用 setValue 代替 JFormattedTextField 并且您应该使用真正的 setValue(null) 来清除该字段

【讨论】:

您指向 DocumentFilter 示例的链接似乎已损坏 @HovercraftFullOfEels 是的,欢迎上网?【参考方案2】:

如果您不想允许无效输入但仍应允许空文本字段怎么办?只需覆盖 NumberFormatter 中的 stringToValue() 方法

NumberFormat intFormat = NumberFormat.getIntegerInstance();
intFormat.setGroupingUsed(false);
NumberFormatter numberFormatter = new NumberFormatter(intFormat)
    @Override
    public Object stringToValue(String text) throws ParseException 
        if (text.length() == 0)
            return null;
        return super.stringToValue(text);
    
;
numberFormatter.setValueClass(Integer.class); 
numberFormatter.setAllowsInvalid(false);
numberFormatter.setMinimum(0);
numberFormatter.setMaximum(99999999);

【讨论】:

【参考方案3】:

releaseNoTextField.setFocusLostBehavior(javax.swing.JFormattedTextField.COMMIT);

【讨论】:

以上是关于清除 JFormattedTextField 的内容不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

JFormattedTextField 仅返回默认值

如何从 JformattedTextfield 检索货币格式值

JFormattedTextField 接受不同的位数

具有任意小数位数的 JFormattedTextfield

为 JFormattedTextField 分配一个浮点数

在 JFormattedTextField 中禁用哔声