JavaFX TextField:自动将文本转换为大写

我的FXMl上有一个JavaFX TextField控件,看起来像这样……

 

我想在用户输入时自动所有字符更改大写

我控制器中的代码:

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

有几种方法可以实现这一目标:

覆盖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两次, 应该使用。 它只是在这里显示原始post

不要在TextField上使用onKeyPressed ,而是使用TextField的textProperty() 。 只需在控制器的initialize()中添加以下代码即可。

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

从JavaFX 8u40开始,您可以在文本字段上设置TextFormatter对象。 这允许您在用户输入上应用filter/转换器。 这是一个例子 。

听取text属性中的更改会带来触发两个更改事件的缺点,一个用于初始输入(在您的情况下是小写字符),另一个用于更正的输入(大写字符)。 如果text属性上还有其他侦听器,则需要处理这两个事件并确定哪个事件与它们相关。 TextFormatter方法没有这个缺点。