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 не имеет этого недостатка.