【问题标题】:Clearing contents of JFormattedTextField not working?清除 JFormattedTextField 的内容不起作用?
【发布时间】:2015-10-30 11:05:52
【问题描述】:
  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("") 清除此文本字段也不起作用,还有其他方法吗?

【问题讨论】:

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

标签: java swing jformattedtextfield


【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多