我有一个带有以下事件处理程序的javaFX文本字段:
public static EventHandler<KeyEvent> numericValidation(final Integer maxLengh) {
return new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
TextField txt_TextField = (TextField) e.getSource();
if (txt_TextField.getText().length() >= max_Lengh) {
e.consume();
}
if(!e.getCharacter().matches("[0-9]")){
e.consume();
}
}
};
}
...
yearTextField.addEventFilter(KeyEvent.KEY_TYPED , numeric_Validation(4));
这应该确保文本字段只能接受最多maxLength
个数字的数字。问题是,现在如果我从文本字段中选择一些文本(一些数字),然后尝试写其他数字,它将无能为力。我希望将所选文本替换为我正在写的内容,就像它与基本文本字段一样,只要它是数字并且不会超过maxLength
的长度即可。
我该如何实现?
答案 0 :(得分:0)
使用使用TextFormatter
创建的UnaryOperator
作为构造函数参数。该UnaryOperator
接收一个对象,该对象除其他信息外还包含输入所产生的新文本。您可以返回影响结果的修改后的更改,也可以只返回null
作为输入,而不修改TextField
。
如果您将多个数字复制并粘贴到TextField
...
示例:
int maxLength = 8;
final String matchString = "\\d{0," + maxLength + "}"; // allow 0 to maxLength digits
TextField textField = new TextField();
TextFormatter<?> formatter = new TextFormatter<>(change -> {
String newText = change.getControlNewText();
return newText.matches(matchString) ? change : null;
});
textField.setTextFormatter(formatter);