JavaFX TextField: автоматическое преобразование текста в верхний регистр

у меня есть элемент управления текстовым полем JavaFX на моем FXMl, который выглядит так...

<TextField fx:id="input_search" onKeyPressed="#keyListener" prefHeight="25.0" prefWidth="197.0" />

Я хочу автоматически изменить все символы верхний при вводе.

код в моем контроллере:

public void keyListener(KeyEvent event){
    //maybe transform the pressed key to uppercase here...
}

2 ответов


есть несколько способов добиться этого:

переопределить replaceText()

TextField textField = new TextField() {
    @Override public void replaceText(int start, int end, String text) {
        super.replaceText(start, end, text.toUpperCase());
    }
};

использовать TextFormatter

textField.setTextFormatter(new TextFormatter<>((change) -> {
    change.setText(change.getText().toUpperCase());
    return change;
}));

эта часть ответа триггеры textProperty и дважды не стоит использоваться. Это только здесь, чтобы показать оригинальный пост.

вместо onKeyPressed в текстовом поле используйте textProperty() вашего текстового поля. Просто добавьте следующий код внутри initialize() из контроллер.

input_search.textProperty().addListener((ov, oldValue, newValue) -> {
     input_search.setText(newValue.toUpperCase());
});

начиная с JavaFX 8u40, вы можете установить объект TextFormatter в текстовом поле. Это позволяет применять фильтр / преобразователь на входе пользователя. вот пример.

прослушивание изменений в свойстве text связано с недостатком запуска двух событий изменения, одного для начального ввода (в вашем случае-символов нижнего регистра) и другого для исправленного ввода (символов верхнего регистра). Если в свойстве text есть другие прослушиватели, они нужно будет разобраться с обоими событиями и решить, какое событие для них актуально. Подход TextFormatter не имеет этого недостатка.