You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测JavaFX中TextField失去焦点?是否有对应事件?

检测JavaFX TextField失去焦点的正确方法

你现在用的setOnMouseExited其实不太合适——鼠标离开文本框并不等同于文本框失去焦点(比如用户用Tab键切换到其他控件,鼠标没离开也会触发焦点转移)。JavaFX里专门有处理焦点变化的事件——FocusEvent,其中FOCUS_LOST就是你要找的“失去焦点”对应事件,和KeyEvent属于同类型的UI事件。

正确实现方式

你可以直接用TextField的setOnFocusLost方法绑定失去焦点时的处理逻辑,这样不管用户是通过鼠标离开还是键盘切换焦点,都会触发你的验证逻辑。下面是修改后的代码示例:

private void buildGui() { 
    setVgap(10); 
    setHgap(10); 
    setPadding(new Insets(50)); 

    Label lblgb = new Label("Gebruikersnaam:"); 
    Label lblww1 = new Label("Wachtwoord:"); 
    Label lblww2 = new Label("Bevestig wachtwoord:"); 

    txfGebruikersnaam = new TextField(); 
    txfWachtwoord = new TextField(); 
    txfWachtwoord2 = new TextField(); 

    // 替换MouseExited为FocusLost事件
    txfGebruikersnaam.setOnFocusLost(new javafx.event.EventHandler<FocusEvent>() { 
        @Override 
        public void handle(FocusEvent event) { 
            String gebr = txfGebruikersnaam.getText().trim(); 
            if (gebr.contains(" ")) { // 这里建议用contains替代matches("\\s"),matches是匹配整个字符串
                String[] strSplit = gebr.split(" ");
                // 额外判断分割后的数组长度,避免数组越界
                if (strSplit.length == 2) {
                    String a = strSplit[0]; 
                    String b = strSplit[1]; 
                    if (a.length() >= 4 && b.length() >= 8) { 
                        if (!(Character.isUpperCase(a.charAt(0)) && Character.isDigit(b.charAt(b.length() - 1)))) { 
                            errorAlerts("Het eerste woord moet beginnen met een hoofdletter, het 2e moet eindigen met een cijfer!"); 
                        } 
                    } else { 
                        errorAlerts("Het eerste woord moet minstens 4 letters lang zijn, het 2e minstens 8!"); 
                    }
                } else {
                    errorAlerts("Uw gebruikersnaam moet uit precies 2 woorden bestaan!");
                }
            } else { 
                errorAlerts("Uw gebruikersnaam moet uit 2 woorden bestaan!"); 
            } 
        } 
    }); 
}

补充说明

  • FocusEvent有两个核心事件类型:FocusEvent.FOCUS_GAINED(获取焦点时触发)和FocusEvent.FOCUS_LOST(失去焦点时触发),你可以根据需求灵活选择。
  • 如果需要绑定多个焦点事件处理器(比如同时执行多个逻辑),可以用addEventHandler方法替代setOnFocusLost,后者会覆盖之前绑定的处理器:
    txfGebruikersnaam.addEventHandler(FocusEvent.FOCUS_LOST, event -> {
        // 自定义处理逻辑
    });
    

内容的提问来源于stack exchange,提问作者Java_pls_why

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:53