清除 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
是什么意思?
我“认为”JFormattedTextField
、NumberFormatter
和 NumberFormat
之间的要求是 ""
不是有效数字,因此它拒绝您删除最后一个字符的尝试。 numberFormatter.setAllowsInvalid
强制执行此要求。如果您并不真正关心值的格式,而只是限制用户的输入,则可以使用 JTextField
和 DocumentFilter
@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 的内容不起作用?的主要内容,如果未能解决你的问题,请参考以下文章