我正在尝试弄清楚如何监听另一个类中的属性更改。下面是我的代码:
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);
}
}Main是我需要了解属性更改的地方:
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,并试图找到一个解决方案,但无济于事。
发布于 2011-02-14 07:30:38
代码:
private static PropertyChangeListener listen() {
System.out.println(test.getUsersOnline());
return null;
}返回null,这意味着“没有对象”,这反过来又意味着test.addPropertyChangeListener(listen())实际上是test.addPropertyChangeListener(null),它不会注册任何东西。
必须将有效的PropertyChangeListener实例传递给addPropertyChangeListener()方法。
编辑
我建议你阅读Java教程中关于PropertyChangeListeners的章节:
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() {
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
}
}发布于 2021-02-24 19:51:13
我所做的是在ClassWithProperty类中放入一个方法:
public PropertyChangeSupport getPropertyChangeSupport() {
return changes;
}然后,在Main()类的构造函数中注册属性更改事件:
private void initializeListeners() {
test.getPropertyChangeSupport().addPropertyChangeListener((PropertyChangeEvent event) -> {
if (event.getPropertyName().equals("usersOnline")) {
String passedEventData = (String) event.getNewData();
}
});
}这样,您就不会用PropertyChangeSupport类中已有的方法重复ClassWithProperty中的代码。
当您需要在ClassWithProperty类中触发事件时,请执行以下操作:
changes.firePropertyChange("usersOnline", oldValue, newValue);这种方法的一个显著特点是,如果
如果event.getOldValue()和event.getNewValue()相等,则不会触发该事件。如果您希望使用相同的信息触发重复的事件,请在oldValue字段中使用null;firePropertyChange()方法只传递int、boolean和Object。因此,如果不传递int或boolean,则需要在接收端强制转换在事件中传递的值。
发布于 2011-02-14 06:58:08
你的方法如下:
public ClassWithProperty() {
usersOnline = 0;
while (usersOnline<10) {
changes.firePropertyChange("usersOnline", usersOnline, usersOnline++);
usersOnline++;
}
}有一个while循环,它将不断地循环和阻塞线程。我对属性更改侦听器的有限了解是,它们侦听绑定的属性(这里是usersOnLine变量)的更改,这意味着只有当这个数字发生更改时(可能在任何setUserOnLine、addUserOnLine、removeUserOnLine和类似方法中),属性更改才会触发。有关绑定属性的更多信息,请查看此处:Bound Properties
https://stackoverflow.com/questions/4987476
复制相似问题