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

如何监听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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:22:16