使TextField只接受字母字符

时间:2018-04-18 14:40:15

标签: java javafx javafx-8

我有这段代码,它应该删除任何非字符值并用空格替换它(它会删除非字符值)

public void firstNameOnlyText() {
    txtFirstName.textProperty().addListener(new ChangeListener<String>() {
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

            if (!newValue.matches("\\D*")) {
                    txtFirstName.setText(newValue.replaceAll("[^\\D]", ""));
                }
            }
    });
}

代码完全可以删除数字,但我不知道使用什么正则表达式,所以它也取代了标点符号(例如`,!,],[等等]

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

首先,不要使用侦听器来实现此功能。这里的问题是,如果在文本字段的text属性上有另一个侦听器,那么该侦听器将在恢复到有效状态之前看到无效状态(使用非字符输入)。文本字段上任何类型的过滤器的目的应该是确保只能看到有效状态。您应该使用TextFormatter代替。

正则表达式规则在Pattern documentation中描述。如果您想允许任何大写或小写字母字符,可以使用"[a-zA-Z]";如果您想明确匹配Character.isLowerCase()Character.isUpperCase()的规则,可以使用

"[\\p{javaLowerCase}\\p{javaUpperCase}]"

以下是一个例子:

Pattern pattern = Pattern.compile("[a-zA-Z]*");
UnaryOperator<TextFormatter.Change> filter = c -> {
    if (pattern.matcher(c.getControlNewText()).matches()) {
        return c ;
    } else {
        return null ;
    }
};
TextFormatter<String> formatter = new TextFormatter<>(filter);
txtFirstName.setTextFormatter(formatter);

答案 1 :(得分:0)

您可以使用否定的正则表达式集^来仅保留A到Z(不区分大小写)。如果筛选的字符串不同,请设置文本框的值。

final String filtered = newValue.replaceAll("[^a-zA-Z]", "");
if (!newValue.equals(filtered)) {
    // set 
}