JavaFXTextField文本验证

JavaFXTextField文本验证,java,javafx,event-handling,keyevent,Java,Javafx,Event Handling,Keyevent,我有一个侦听器应用于我的字段: nameTextField.addEventHandler(KeyEvent.KEY_TYPED, fieldChangeListener(50)); 事件处理程序: private EventHandler<KeyEvent> fieldChangeListener(final Integer max_Lengh) { return new EventHandler<KeyEvent>() { @

我有一个
侦听器
应用于我的字段:

nameTextField.addEventHandler(KeyEvent.KEY_TYPED, fieldChangeListener(50));
事件处理程序:

private EventHandler<KeyEvent> fieldChangeListener(final Integer max_Lengh) {
        return new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                TextField field = (TextField) event.getSource();
                String text = field.getText();
                // I need here something like:
                if(KeyEvent.VK_ENTER){
                // do special part for ENTER KEY
                }
            }
         }
}
private EventHandler fieldChangeListener(最终整数最大长度){
返回新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
TextField=(TextField)event.getSource();
String text=field.getText();
//我需要这样的东西:
if(KeyEvent.VK_输入){
//为回车键做特殊的部分
}
}
}
}

问题是
KeyEvent事件
来自
javafx.scene.input.KeyEvent
KeyEvent.VK\u ENTER
来自
com.sun.glass.events.KeyEvent
。我不知道如何确定ENTER键是否触发了
key\u类型的
事件。

如果要在文本更改时进行输入验证,可以使用
文本字段
文本属性
上的侦听器:

textField.textProperty().addListener((observable, oldValue, newValue) ->
    System.out.println("Input Validation"));
要在按下Enter键时进行检测,可以使用OnAction属性

textField.setOnAction(event -> System.out.println("Enter pressed: Word Check"));

如果要防止用户输入未通过验证逻辑的字符,则可以使用
TextFormatter
(此
TextField
仅接受整数),而不是侦听
textProperty

textField.setTextFormatter(新的TextFormatter(更改->
(change.getControlNewText()匹配(([1-9][0-9]*)?)更改:null);

如果要在文本更改时进行输入验证,可以在
文本字段的
文本属性上使用侦听器:

textField.textProperty().addListener((observable, oldValue, newValue) ->
    System.out.println("Input Validation"));
要在按下Enter键时进行检测,可以使用OnAction属性

textField.setOnAction(event -> System.out.println("Enter pressed: Word Check"));

如果要防止用户输入未通过验证逻辑的字符,则可以使用
TextFormatter
(此
TextField
仅接受整数),而不是侦听
textProperty

textField.setTextFormatter(新的TextFormatter(更改->
(change.getControlNewText()匹配(([1-9][0-9]*)?)更改:null);

最后你想实现什么?基本上,我想控制用户输入。这就是为什么我要使用键入的
键,但问题是我不希望在按下ENTER键时执行某些代码。在输入的情况下,我不希望它通过输入验证,而是通过较小的全字检查。不要使用关键字侦听器来验证文本字段中的输入。如果要限制或操纵用户输入,请使用
TextFormatter
,如果要在用户按Enter键(或以其他方式提交)时进行验证,请使用
onAction
处理程序。是的,@James_D是对的,我不知道这是“验证”还是“预防”用例。更新了答案。最后你想实现什么?基本上,我想控制用户输入。这就是为什么我要使用键入的
键,但问题是我不希望在按下ENTER键时执行某些代码。在输入的情况下,我不希望它通过输入验证,而是通过较小的全字检查。不要使用关键字侦听器来验证文本字段中的输入。如果要限制或操纵用户输入,请使用
TextFormatter
,如果要在用户按Enter键(或以其他方式提交)时进行验证,请使用
onAction
处理程序。是的,@James_D是对的,我不知道这是“验证”还是“预防”用例。更新了答案。我正在使用
KEY\u-TYPED
event好的,我不太明白背后的原因,但我根据您的要求更新了答案,这可能更适合您的需要。我以前曾想过,但使用它无法控制用户输入,防止他键入错误字符。我目前正在研究切换到按下
键的可能性。我遇到的第一个减号是,如果使用了
BACKSPACE
,如何检查结果?如果用户选择了单词的一部分并将其删除,您如何确定
BACKSPACE
的长度?不清楚您是否要验证:用户键入并计算键入的字符串是否有效,还是要防止用户键入无效字符。在后一种情况下,可以使用
TextFormatter
。更新了答案。我正在使用
KEY\u-TYPED
event好的,我不太明白背后的原因,但我根据您的要求更新了答案,这可能更适合您的需要。我以前曾想过,但使用它无法控制用户输入,防止他键入错误字符。我目前正在研究切换到按下
键的可能性。我遇到的第一个减号是,如果使用了
BACKSPACE
,如何检查结果?如果用户选择了单词的一部分并将其删除,您如何确定
BACKSPACE
的长度?不清楚您是否要验证:用户键入并计算键入的字符串是否有效,还是要防止用户键入无效字符。在后一种情况下,可以使用
TextFormatter
。更新了答案。