清除 JFormattedTextField 的内容不起作用?

Clearing contents of JFormattedTextField not working?

  1. 我有一个 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);
    

这里有什么问题?

  1. 使用 releaseNoTextField.setText("") 清除此文本字段也不起作用,是否有其他方法可以做到这一点?

I have a JFormattedTextField which accepts number of 8 digits only, but when I try to clear the textfield with backspace button it doesnt delete first character of number (same behavior with delete button too), I have to presee Esc key to delete this character each time.

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

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

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

Also clearing this textfield with releaseNoTextField.setText("") is not working, is there another way to do this ?

您应该(始终)使用 setValue 作为 JFormattedTextField 并且您应该使用 true setValue(null) 来清除字段

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

如果您不想允许无效输入但仍然允许空文本字段怎么办?只需覆盖 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);