JavaFX TextField添加的属性监听器始终未被调用的原因
问题根因
你的监听器从未触发和垃圾回收无关,核心原因是你监听的目标属性选错了。onKeyPressedProperty()对应的是TextField上存储「按键按下事件处理器」的属性本身,这个属性的值只有在你主动调用setOnKeyPressed()替换整个事件处理器对象的时候才会发生变更,此时才会触发你绑定的变更监听器。
你在输入框里按键输入时,只会触发这个属性里存的事件处理器执行,根本不会修改这个属性本身的值,所以你注册的监听器永远不会被调用。
另外补充:JavaFX组件的属性会持有其上注册的所有监听器的强引用,只要TextField组件本身还在内存中存活,监听器就不可能被垃圾回收,你之前的猜测不成立。
正确实现方式
根据你的实际需求二选一即可:
- 如果要监听输入框的文本内容变化,监听文本属性:
@FXML private void initialize() { emailTextField.textProperty().addListener((observable, oldValue, newValue) -> { LOG.info("输入内容变更,新值为:" + newValue); }); }
- 如果要监听按键按下事件,直接用你已经验证可用的
setOnKeyPressed方法即可:
@FXML private void initialize() { emailTextField.setOnKeyPressed(event -> { LOG.info("捕获到按键事件,按键为:" + event.getCode()); }); }
内容的提问来源于stack exchange,提问作者supernov
相关产品推荐
相关产品推荐

