Java PropertyChangeListener [英] 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屋!