如何检测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
相关产品推荐
相关产品推荐

