Java PropertyChangeListener [英] Java PropertyChangeListener

查看:41
本文介绍了Java PropertyChangeListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图弄清楚如何在另一个类中侦听属性更改.下面是我的代码:

I'm trying to figure out how to listen to a property change in another class. Below is my code:

ClassWithProperty具有我想听的属性:

ClassWithProperty has the property I want to listen to:

public class ClassWithProperty {
    private PropertyChangeSupport changes = new PropertyChangeSupport(this); 
    private int usersOnline;

    public int getUsersOnline() {
        return usersOnline;
    }

    public ClassWithProperty() {
        usersOnline = 0;
        while (usersOnline<10) {
            changes.firePropertyChange("usersOnline", usersOnline, usersOnline++);
        }
    }

    public void addPropertyChangeListener(
        PropertyChangeListener l) {
        changes.addPropertyChangeListener(l);
    }
    public void removePropertyChangeListener(
        PropertyChangeListener l) {
        changes.removePropertyChangeListener(l);
    }
}

主要是我需要了解属性更改的地方:

Main is where i need to know about the property change:

public class Main {

    private static ClassWithProperty test;

    public static void main(String[] args) {
        test = new ClassWithProperty();
        test.addPropertyChangeListener(listen());

    }

    private static PropertyChangeListener listen() {
        System.out.println(test.getUsersOnline());
        return null;
    }

}

我只有最后一次触发该事件(usersOnline = 10).我是Java新手,并试图找到解决方案,但无济于事.

I have the event fired only the last time (usersOnline=10). I'm new to Java and tried to find a solution, but to no avail.

推荐答案

代码:

private static PropertyChangeListener listen() {
    System.out.println(test.getUsersOnline());
    return null;
}

返回 null ,表示无对象",这反过来意味着 test.addPropertyChangeListener(listen())实际上是 test.addPropertyChangeListener(null),它不会注册任何内容.

returns null which means "no object", which in turn means that test.addPropertyChangeListener(listen()) is effectively test.addPropertyChangeListener(null), which won't register anything.

您必须将 PropertyChangeListener 的有效实例传递给 addPropertyChangeListener()方法.

You must pass a valid instance of a PropertyChangeListener to the addPropertyChangeListener() method.

修改

我建议您阅读Java教程中有关PropertyChangeListener的章节:
http://download.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

I suggest you read the Java tutorial's chapter about PropertyChangeListeners:
http://download.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

您的代码的另一个问题是您在 ClassWithProperty 的构造函数中调用 firePropertyChange().但是那时,可能没有注册任何侦听器,因此它没有任何作用.在您触发事件后 ,对 addPropertyChangeListener()的任何调用都会发生.

Another problem of your code is that you call firePropertyChange() in the constructor of ClassWithProperty. But at that time, no listener can possibly be registered, so it does not have any effect. Any call to addPropertyChangeListener() happens after you have fired the events.

在这里您的代码已被修改,以使其可以正常工作(虽然尚未对其进行测试...):

Here is your code modified so that it should work (haven't tested it though...):

public class ClassWithProperty {
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);
    private int usersOnline = 0;

    public ClassWithProperty() {
    }

    public void setupOnlineUsers() 
    {
        while (usersOnline < 10) {
            changes.firePropertyChange("usersOnline", usersOnline, ++usersOnline);
        }
    }

    public int getUsersOnline() {
        return usersOnline;
    }

    public void addPropertyChangeListener(PropertyChangeListener l) {
        changes.addPropertyChangeListener(l);
    }

    public void removePropertyChangeListener(PropertyChangeListener l) {
        changes.removePropertyChangeListener(l);
    }
}

public class MainListener implements PropertyChangeListener {
    private ClassWithProperty test;

    public MainListener() {
        test = new ClassWithProperty();
        test.addPropertyChangeListener(this);
        test.setupOnlineUsers();
    }

    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println(test.getUsersOnline());
    }

    public static void main(String[] args) {
        new MainListener(); // do everything in the constructor
    }
}

这篇关于Java PropertyChangeListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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