JavaFX - TextField с регулярным выражением для почтового индекса - PullRequest
1 голос
/ 04 июня 2019

для моей программы я хочу использовать TextField, где пользователь может ввести почтовый индекс (немецкий).Для этого я попробовал то, что вы можете увидеть ниже.Если пользователь вводит более 5 цифр, каждая дополнительная цифра должна быть немедленно удалена.Конечно, буквы не допускаются.

Когда я использую этот шаблон ^ [0-9] {0,5} $ на https://regex101.com/, он делает то, что хотел, но когда я пытаюсь это сделать вJavaFX это не работает.Но я пока не смог найти решение.

Может кто-нибудь сказать мне, что я сделал не так?

Редактировать: Для людей, которые еще не работали с JavaFX: когда пользователь вводит толькоодин символ, вызывается метод check (String text).Таким образом, результат также должен быть истинным, когда есть от 1 до 5 цифр.Но не более; -)


public class NumberTextField extends TextField{

    ErrorLabel label;

    NumberTextField(String text, ErrorLabel label){
        setText(text);
        setFont(Font.font("Calibri", 17));
        setMinHeight(35);
        setMinWidth(200);
        setMaxWidth(200);
        this.label = label;
    }

    NumberTextField(){}

    @Override
    public void replaceText(int start, int end, String text){
        if(check(text)) {
            super.replaceText(start, end, text);
        }
    }

    @Override
    public void replaceSelection(String text){
        if(check(text)){
            super.replaceSelection(text);
        }
    }

    private boolean check(String text){
        if(text.matches("^[0-9]{0,5}$")){
            label.setText("Success");
            label.setBlack();
            return true;
        } else{
            return false;
        }
    }

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Вам не нужно расширять TextField, чтобы сделать это.На самом деле я рекомендую использовать TextFormatter, поскольку это проще реализовать:
Не требуется перезаписывать несколько методов.Вам просто нужно решить на основе данных о желаемом вводе, хотите ли вы разрешить изменение или нет.

final Pattern pattern = Pattern.compile("\\d{0,5}");
TextFormatter<?> formatter = new TextFormatter<>(change -> {
    if (pattern.matcher(change.getControlNewText()).matches()) {
        // todo: remove error message/markup
        return change; // allow this change to happen
    } else {
        // todo: add error message/markup
        return null; // prevent change
    }
});
TextField textField = new TextField();
textField.setTextFormatter(formatter);
0 голосов
/ 04 июня 2019

Ваше исходное выражение должно работать нормально, хотя, если мы хотим проверить пятизначный почтовый индекс, мы можем захотеть удалить квантификатор 0:

^[0-9]{5}$
^\d{5}$

В целях проверки нам может потребоватьсячтобы сохранить начальную и конечную привязки, однако для простого тестирования мы можем удалить и посмотреть:

[0-9]{5}
\d{5}

Вполне вероятно, что некоторые другие символы будут проходить через наши входные данные, которые мы не хотим иметь.

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "^[0-9]{5}$";
final String string = "01234\n"
     + "012345\n"
     + "0\n"
     + "1234";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
...