JavaFX: удаление пробелов из TextField с использованием TextFormatter - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь сделать небольшую программу, которая ищет слова в словаре в JavaFX.У меня есть TextField, где пользователь может указать искомое слово.Поиск не работает, если есть пробелы.Я пытался использовать TextFormatter для удаления пробелов оттуда.

        searchField.setTextFormatter(new TextFormatter<String>((Change change) -> {
        String newText = change.getControlNewText();
        if (newText.matches(" ")) {
            change.setText(change.getText().replace(" ", ""));
            return change;
        }
        if (newText.matches("[A-Z]*")) {
            change.setText(change.getText().toLowerCase());
            return change;
        }
        return change;
    }));

1 Ответ

0 голосов
/ 28 декабря 2018

Свойство controlNewText содержит весь текст после редактирования.Единственный случай, когда это может соответствовать " ", это если вы начинаете с пустого TextField и нажимаете пробел.Единственный случай, когда это соответствует "[A-Z]*", - это когда все символы в TextField прописные;он не совпадает, если содержимое TextField равно foo и вы добавляете B.

Также необходимо учитывать, что

  • пользователь может копировать и вставлять текст в TextField, в результате чего свойство text содержит более одного символа
  • Можно выбрать несколько символов, и фиксированный текст может не соответствовать исходному редактированию по длине, требуя от васотрегулируйте диапазон выбора

Это должно удовлетворить ваши требования (или, по крайней мере, подойти достаточно близко, чтобы закончить код самостоятельно):

TextField textField = new TextField();
TextFormatter<?> formatter = new TextFormatter<>((TextFormatter.Change change) -> {
    String text = change.getText();

    // if text was added, fix the text to fit the requirements
    if (!text.isEmpty()) {
        String newText = text.replace(" ", "").toLowerCase();

        int carretPos = change.getCaretPosition() - text.length() + newText.length();
        change.setText(newText);

        // fix carret position based on difference in originally added text and fixed text
        change.selectRange(carretPos, carretPos);
    }
    return change;
});
textField.setTextFormatter(formatter);
...