如何监听JavaFX中Stage的userData属性变化?
如何正确监听JavaFX中Stage的userData属性变化
你之前的实现无效,核心问题是:你创建的SimpleObjectProperty只是初始值复制了stage.getUserData()的结果,但它和Stage内部维护的userData没有任何关联。调用stage.setUserData()只会修改Stage自身存储的值,不会同步到你手动创建的这个Property,所以监听器永远不会被触发。
正确实现方式:监听Stage的Properties集合
Stage的userData本质是存储在它的Properties集合中(键为"userData"),所以可以直接监听这个集合的变化来捕获userData的更新:
// 监听Stage的properties集合变化 stage.getProperties().addListener((MapChangeListener<? super Object, ? super Object>) change -> { // 只关注userData对应的键 if ("userData".equals(change.getKey())) { System.out.println("new userdata:" + change.getValueAdded()); } }); // 测试代码 stage.setUserData(2); stage.setUserData(3);
执行后输出:
new userdata:2 new userdata:3
另一种方式:自定义绑定的ObjectProperty
如果你希望通过标准的JavaFX Property API来操作userData,可以自定义一个和Stage的userData绑定的Property。若要实现无论是通过stage.setUserData()还是Property的set()方法修改都触发监听器,需要结合Properties监听:
ObjectProperty<Object> userDataProperty = new SimpleObjectProperty<>(stage, "userData") { @Override public Object get() { return stage.getUserData(); } @Override public void set(Object newValue) { stage.setUserData(newValue); } // 监听Stage的properties,确保直接调用stage.setUserData()时也触发监听器 { stage.getProperties().addListener((MapChangeListener<? super Object, ? super Object>) change -> { if ("userData".equals(change.getKey())) { fireValueChangedEvent(); } }); } }; // 添加监听器 userDataProperty.addListener((observable, oldValue, newValue) -> { System.out.println("new userdata:" + newValue); }); // 测试:两种修改方式都会触发监听器 userDataProperty.set(2); stage.setUserData(3);
内容的提问来源于stack exchange,提问作者Becker
相关产品推荐
相关产品推荐

