首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java PropertyChangeListener

Java PropertyChangeListener
EN

Stack Overflow用户
提问于 2011-02-14 06:51:51
回答 3查看 49K关注 0票数 11

我正在尝试弄清楚如何监听另一个类中的属性更改。下面是我的代码:

ClassWithProperty有我想要监听的属性:

代码语言:javascript
复制
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是我需要了解属性更改的地方:

代码语言:javascript
复制
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,并试图找到一个解决方案,但无济于事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-14 07:30:38

代码:

代码语言:javascript
复制
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()的调用都发生在触发事件的之后。

以下是修改后的代码,使其可以正常工作(虽然还没有进行测试...):

代码语言:javascript
复制
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
    }
}
票数 15
EN

Stack Overflow用户

发布于 2021-02-24 19:51:13

我所做的是在ClassWithProperty类中放入一个方法:

代码语言:javascript
复制
public PropertyChangeSupport getPropertyChangeSupport() {
    return changes;
}

然后,在Main()类的构造函数中注册属性更改事件:

代码语言:javascript
复制
private void initializeListeners() {
    test.getPropertyChangeSupport().addPropertyChangeListener((PropertyChangeEvent event) -> {
        if (event.getPropertyName().equals("usersOnline"))   {
            String passedEventData = (String) event.getNewData(); 
        }
    });
}

这样,您就不会用PropertyChangeSupport类中已有的方法重复ClassWithProperty中的代码。

当您需要在ClassWithProperty类中触发事件时,请执行以下操作:

代码语言:javascript
复制
changes.firePropertyChange("usersOnline", oldValue, newValue);

这种方法的一个显著特点是,如果

如果event.getOldValue()和event.getNewValue()相等,则不会触发该事件。如果您希望使用相同的信息触发重复的事件,请在oldValue字段中使用null;firePropertyChange()方法只传递int、boolean和Object。因此,如果不传递int或boolean,则需要在接收端强制转换在事件中传递的值。

票数 1
EN

Stack Overflow用户

发布于 2011-02-14 06:58:08

你的方法如下:

代码语言:javascript
复制
public ClassWithProperty() {
    usersOnline = 0;
    while (usersOnline<10) {
        changes.firePropertyChange("usersOnline", usersOnline, usersOnline++);
        usersOnline++;
    }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4987476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档