Java PropertyChangeListener

Lap*_*aig 10 java

我正在试图弄清楚如何在另一个班级中听取属性变化.以下是我的代码:

ClassWithProperty具有我想要监听的属性:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要是我需要了解房产变化的地方:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

a_h*_*ame 13

代码:

private static PropertyChangeListener listen() {
    System.out.println(test.getUsersOnline());
    return null;
}
Run Code Online (Sandbox Code Playgroud)

返回null意味着"没有对象",这反过来意味着test.addPropertyChangeListener(listen())有效 test.addPropertyChangeListener(null),不会注册任何东西.

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

编辑

我建议你阅读关于PropertyChangeListeners的Java教程章节:http:
//download.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

你的代码的另一个问题是你firePropertyChange()在构造函数中调用ClassWithProperty.但那时,没有可能注册的听众,所以它没有任何效果.您触发事件addPropertyChangeListener()发生任何调用.

这是你的代码修改,以便它应该工作(虽然没有测试...):

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
    }
}
Run Code Online (Sandbox Code Playgroud)