Java PropertyChangeListener

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

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

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

 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新手并试图找到解决方案,但无济于事。

代码

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

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

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

编辑

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

您的代码的另一个问题是您在ClassWithProperty的构造函数中调用firePropertyChange()。 但那时,没有可能注册的听众,所以它没有任何效果。 触发事件 ,会发生对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() { ClassWithProperty test = new ClassWithProperty(); test.addPropertyChangeListener(this); test.setupOnlineUsers(); } public void propertyChanged(PropertyChangeEvent evt) { System.out.println(test.getUsersOnline()); } public static void main(String[] args) { new MainListener(); // do everything in the constructor } } 

你的方法在这里:

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

有一个while循环,它将不断循环并阻塞线程。 我对属性更改侦听器的有限知识是他们侦听绑定属性的更改,这里是usersOnLine变量,这意味着只有在此数字发生更改时才会触发属性更改(可能在任何setUserOnLineaddUserOnLineremoveUserOnLine和类似方法中)。 有关绑定属性的更多信息,请查看此处: 绑定属性