将所有注册的侦听器获取到ObservableValue [英] Get all registered listeners to an ObservableValue

查看:41
本文介绍了将所有注册的侦听器获取到ObservableValue的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使所有侦听器都具有可观察的值?我可以扩展该类并覆盖addListenerremoveListener方法以将它们存储在集合中.但是集合应该已经以某种方式存储在可观察值内.我怎么能得到那套?

How to get all listeners to an observable value? I could extend the class and override addListener and removeListener methods to store them in a set. But the set should already be stored somehow inside observable value. How could I get that set?

推荐答案

我找到解决方法,您无法直接访问Listeners列表,但是如果使用调试器(我使用IntelliJ),则可以看到它如果您这样观察您的ObservableProprty :(我希望这足够清楚)

I find a way around it, you can't get direct access to the Listeners list but if you use a debugger(I use IntelliJ) you can see it if you look inside your ObservableProprty like this:(I hope this is clear enough)

另一种方式:(你是一个聪明的人,你会知道如何适应你的情况的)

another way:(You're a smart guy, you'll know how to fit into your case)

    //SimpleFloatProperty we want to find its Listeners
    FloatPropertyBase f=ampPS.currentProperty();
    Object value;
    ChangeListener[] list;
    ChangeListener changeListener=null;
    Field field = null;
    try {
        field = FloatPropertyBase.class.getDeclaredField("helper");
        field.setAccessible(true);
        value = field.get(f);
        try {
            field = value.getClass().getDeclaredField("listener");
            field.setAccessible(true);
            changeListener =(WeakChangeListener)field.get(value);
        }catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        try {
            field = value.getClass().getDeclaredField("changeListeners");
            field.setAccessible(true);
            list =(ChangeListener[])field.get(value);
        }catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

结果:

(请注意1个或多个收听者之间的区别)

(Notice the difference between 1 listener or more than 1)

我要为几种类型的值添加示例

I I'm adding Example for several types of values

public static ChangeListener[] getChangeListeners(ObservableValue observableValue){

    Object value;
    ChangeListener[] list=null;
    ChangeListener changeListener=null;
    Field field = null;

    try {
        if(observableValue instanceof SimpleFloatProperty ){
            field = FloatPropertyBase.class.getDeclaredField("helper");
        }
        else if(observableValue instanceof SimpleBooleanProperty ){
            field = BooleanPropertyBase.class.getDeclaredField("helper");
        }
        else if(observableValue instanceof SimpleIntegerProperty ){
            field = IntegerPropertyBase.class.getDeclaredField("helper");
        }
        field.setAccessible(true);
        value = field.get(observableValue);
        try {
            field = value.getClass().getDeclaredField("listener");
            field.setAccessible(true);
            changeListener =(ChangeListener)field.get(value);
        }catch (NoSuchFieldException e) {
            //e.printStackTrace();
        }
        try {
            field = value.getClass().getDeclaredField("changeListeners");
            field.setAccessible(true);
            list =(ChangeListener[])field.get(value);
        }catch (NoSuchFieldException e) {
            //e.printStackTrace();
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    if(list!=null){
        return list;
    }
    else {
        ChangeListener[] changeListeners = new  ChangeListener[1];
        changeListeners[0]=changeListener;
        return changeListeners;
    }
}

我称之为:

    SimpleBooleanProperty booleanProperty = new SimpleBooleanProperty(true);
    SimpleFloatProperty simpleFloatProperty = new SimpleFloatProperty(0);
    SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(1);
    booleanProperty.addListener(changeListener);
    simpleFloatProperty.addListener(changeListener);
    simpleIntegerProperty.addListener(changeListener);
    simpleIntegerProperty.addListener(changeListener);
    System.out.println(getChangeListeners(booleanProperty).length);
    System.out.println(getChangeListeners(simpleFloatProperty).length);
    System.out.println(getChangeListeners(simpleIntegerProperty).length);

结果:

所以我确实收到警告,但是工作已经完成!

so I do get warnings, but the job is done!

这篇关于将所有注册的侦听器获取到ObservableValue的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆