Я думаю, что это может сделать то, что вы хотите:
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
...
TextField tpo = ...;
tpo.setTextFormatter(new TextFormatter<>((change) -> {
String text = change.getControlNewText();
if (text.matches("\\d*\\.?\\d*")) {
return change;
} else {
return null;
}
}));
Для каждого изменения, примененного к TextField
, будет проверяться, каким будет новый текст, и будет ли он соответствовать заданному шаблону. Поскольку пользователь, скорее всего, вводит символы по одному (а не вставляет), нам нужно разрешить, чтобы более поздняя часть шаблона еще не была набрана, поэтому нам нужно разрешить ноль или более цифр после точки, и если мы хотим Чтобы пользователь мог полностью удалить свой ввод, нам нужно, чтобы все было необязательно. Вам нужно будет проверить окончательный шаблон при подаче, чтобы убедиться, что они ввели полный действительный дубль.