JavaFX:使用TextFormatter从TextField删除空格

时间:2018-12-28 08:16:39

标签: javafx textfield

我正在尝试制作一个小程序,用于在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 :(得分:1)

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);