Используйте 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);