Java PropertyChangeListener

Java PropertyChangeListener,java,Java,我想知道如何在另一个类中监听属性更改。下面是我的代码: ClassWithProperty具有我要侦听的属性: public class ClassWithProperty { private PropertyChangeSupport changes = new PropertyChangeSupport(this); private int usersOnline; public int getUsersOnline() { return user

我想知道如何在另一个类中监听属性更改。下面是我的代码:

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);
    }
}
我只在最后一次触发了事件(usersOnline=10)。 我是Java新手,试图找到解决方案,但没有成功。

您的方法如下:

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

private static PropertyChangeListener listen() {
    System.out.println(test.getUsersOnline());
    return null;
}
返回
null
表示“无对象”,这又表示
test.addPropertyChangeListener(listen())
实际上是
test.addPropertyChangeListener(null)
,它不会注册任何内容

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

编辑

我建议您阅读Java教程中关于PropertyChangeListeners的章节:

代码的另一个问题是,在
ClassWithProperty
的构造函数中调用
firePropertyChange()
。但是在那时,不可能注册任何侦听器,因此它没有任何效果。对
addPropertyChangeListener()
的任何调用都发生在您触发事件之后

以下是您的代码修改,以使其能够正常工作(但尚未对其进行测试…):

公共类ClassWithProperty{
私有PropertyChangeSupport更改=新的PropertyChangeSupport(此);
私有int usersOnline=0;
公共类WithProperty(){
}
public void setupOnlineUsers()
{
while(usersOnline<10){
changes.firePropertyChange(“usersOnline”,usersOnline,++usersOnline);
}
}
public int getUsersOnline(){
返回usersOnline;
}
public void addPropertyChangeListener(PropertyChangeListener l){
更改。addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
更改。removePropertyChangeListener(l);
}
}
公共类MainListener实现PropertyChangeListener{
私有类属性测试;
公共MainListener(){
test=新类WithProperty();
test.addPropertyChangeListener(此);
test.setupOnlineUsers();
}
公共作废属性更改(属性更改事件evt){
System.out.println(test.getUsersOnline());
}
公共静态void main(字符串[]args){
new MainListener();//在构造函数中执行所有操作
}
}

我要做的是在ClassWithProperty类中放置一个方法:

public PropertyChangeSupport getPropertyChangeSupport() {
    return changes;
}
然后,在Main()类的构造函数中注册属性更改事件:

这使得您不会使用PropertyChangeSupport类中已有的方法重复ClassWithProperty中的代码

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

changes.firePropertyChange("usersOnline", oldValue, newValue);
该方法的一个显著特点是,如果 event.getOldValue()和event.getNewValue()的 如果相同,则不会激发事件。如果要激发具有相同信息的重复事件,请在oldValue字段中使用null;
火属性更改()方法只传递int、boolean和Object。因此,如果不传递int或boolean,则需要强制转换在接收端的事件中传递的值。

可能与您的问题无关,但代码中的一个问题是,每次循环迭代都会将usersOnline增加两次。只使用++一次。是的,我的错误,但问题是lem仍然存在。谢谢;)您能将我的代码与示例集成吗?抱歉,我是Java初学者,无法理解它。对我来说,由于我的英语也很差(我来自意大利)。非常感谢。您指向绑定属性的链接已断开,请尝试
public PropertyChangeSupport getPropertyChangeSupport() {
    return changes;
}
private void initializeListeners() {
    test.getPropertyChangeSupport().addPropertyChangeListener((PropertyChangeEvent event) -> {
        if (event.getPropertyName().equals("usersOnline"))   {
            String passedEventData = (String) event.getNewData(); 
        }
    });
}
changes.firePropertyChange("usersOnline", oldValue, newValue);