如何将文本输入到TextField中的唯一有效字符限制为数字和字母? 我已经看到了很多答案,并且尝试了其中一个,但是由于某种原因,我无法使用退格键。 班级在下面。
private class NoSpaceField extends TextField {
public void replaceText(int start, int end, String text) {
String old = getText();
if (text.matches("[A-Za-z0-9\b]")) {
super.replaceText(start, end, text);
}
if (getText().length() > 16)
setText(old);
positionCaret(getText().length());
}
public void replaceSelection(String text) {
String old = getText();
if (text.matches("[A-Za-z0-9\b]")) {
super.replaceSelection(text);
}
if (getText().length() > 16)
setText(old);
positionCaret(getText().length());
}
}
我在RegEx上很糟糕,也不知道如何将退格键添加为有效字符。 另外,我出于不同的目的使用了上面的类(稍作修改),并且效果很好。
您是否看到过这个线程,stackoverflow.com/questions/17438100/
@ chris85我尝试了[A-Za-z0-9\b],但是没有做任何事情,增加反斜杠的数量只是抛出了PatternSyntaxException或什么都不做。
如果您使用的是Java 8u40,则可以使用TextFormatter。 e。像这样的过滤器:
TextField textField = new TextField();
TextFormatter formatter = new TextFormatter( change -> {
change.setText(change.getText().replaceAll("[^a-zA-Z0-9]",""));
return change;
});
textField.setTextFormatter(formatter);
当您e时,这也解决了问题。 G。将一些无效的文本粘贴到文本字段中。
如果您使用的是较低的jdk,则可以尝试使用Christian Schudt的RestrictiveTextField。允许您限制字符并仍使用光标键,退格键等。
有趣;我还没有看到这个。另外,有没有办法限制可以输入的字符数?
在文本格式化程序处理程序中检查更改文本的长度,如果文本太长,请对其进行修改。但是,使用附加的ChangeListener来限制字符数可能更易于实现。
通过使用空字符串调用replaceText和代表要删除的字符位置的索引来调用字符。由于您的正则表达式与空字符串不匹配,因此删除操作将被忽略。
您可能想要的是接受"零个或多个"有效字符。这样,您将识别一个空字符串,并支持多个字符的复制和粘贴。正则表达式看起来像
private class NoSpaceField extends TextField {
public void replaceText(int start, int end, String text) {
String old = getText();
if (text.matches("[A-Za-z0-9]*")) {
super.replaceText(start, end, text);
}
if (getText().length() > 16)
setText(old);
positionCaret(getText().length());
}
public void replaceSelection(String text) {
String old = getText();
if (text.matches("[A-Za-z0-9]*")) {
super.replaceSelection(text);
}
if (getText().length() > 16)
setText(old);
positionCaret(getText().length());
}
}
非常感谢你!
b是退格字符的ASCII码。您可以在正则表达式中使用它。
text.matches(" [A-Za-z0-9 b]")
应该做到的
我已经尝试过了,但是我还是没用;我不知道为什么。我没有在任何地方添加任何EventHandlers,但是我根本不能使用退格键。删除字符的唯一方法是选择多个字符并使用另一个字符。
您运行了哪些测试,并且得到了什么输出?问题可能不在于正则表达式。每次更改字符时都会调用方法replaceText吗?结果是否可能被代码中的其他地方覆盖?
完整的课程可以在这里找到。我只是使用Eclipse运行main方法,然后通过在应用程序的Username框中输入文本进行测试。
看起来您正在调用一个新的NoSpaceField对象,但没有使用您包含的方法来限制用户文本,或者至少在提供的类中的任何位置我都看不到它。
JavaFX在处理输入时使用这些方法。我已经在另一个较小的程序中完成了完全相同的操作,并且工作正常。
如果需要,请考虑对比两个程序以找到主要差异。您是否已验证您的正则表达式有效并且也仅限制字母数字字符?
我已经看过了,他们之间没有区别。但是,您可能会发现我错过的东西,因此该类及其使用的地方在这里和这里。
让我们继续聊天中的讨论。