java - Java:如何允许在 JTextField 中按下退格键
问题描述
我制作了一个 JTextField,它限制输入的字符,除非它是数字、字母“e”或逗号。但现在我意识到它限制了按退格键。我怎样才能改变它?我将在下面添加代码,用于检查正在按下的键
for (JTextField tf : listOfFields)
{
String value = tf.getText();
int n = value.length();
if (ke.getKeyChar()>= '0' && ke.getKeyChar() <= '9' || ke.getKeyChar() == ','|| ke.getKeyChar() == 'e')
{
tf.setEditable(true);
}
else
{
tf.setEditable(false);
}
}}});
解决方案
要让文本字段接受数字输入,您应该使用JFormattedTextField:
JFormattedTextField field = new JFormattedTextField(
NumberFormat.getIntegerInstance());
field.setColumns(12);
要使其同时检查本地化数字格式(使用逗号的格式)和 java.lang 语法(如1e5
),您可以创建一个NumberFormatter来同时执行以下操作:
NumberFormatter formatter = new NumberFormatter() {
@Override
public Object stringToValue(String text)
throws ParseException {
try {
return Double.valueOf(text);
} catch (NumberFormatException ne) {
return super.stringToValue(text);
}
}
};
JFormattedTextField field = new JFormattedTextField(formatter);
field.setColumns(12);
可以使用以下getValue
方法检索每个字段的值:
for (JFormattedTextField tf : listOfFields) {
Number value = (Number) tf.getValue();
// ...
}
限制用户键入的键并不是保证数字输入的正确方法。例如,您的代码将允许用户键入123,4,45,678
.
有许多允许编辑的键。Home、End、Delete 和 Ctrl-A 只是其中的几个。您不应该尝试使用击键白名单明确地容纳它们。让 JFormattedTextField 完成验证输入的工作。
推荐阅读
- python - Python不抛出错误或异常,websocket on_message
- azure-functions - 使用 Quarkus 将功能超时部署到 Azure
- php - Api 平台处理文件上传
- python - 如何将某些行增加 1 Python
- outlook - 如何使用 Office 的诊断 API
- sql - SQL COUNT 项目和 GROUP 超过多个类别,缺少条目的总数为 0
- javascript - 没有分配功能的 Web Sockets 对象
- c# - .NET 中的 Google Analytics API UserActivity
- python - 我的 python 乌龟位于正确的坐标上,我的 if 语句返回为真,但我的 if 语句没有返回为真
- flutter - SingleChildScrollView 内的 Flutter ListView.Builder 不可滚动