【问题标题】:Why does PeropertyChangeListener in Java not work following oracle's tutorials?为什么 Java 中的 PeropertyChangeListener 不能按照 oracle 的教程工作?
【发布时间】:2018-08-16 16:03:26
【问题描述】:

为什么这不起作用?我通过查看https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html#boundhttps://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html 的示例实现了这一点 甚至这篇文章也没有帮助我Java PropertyChangeListener和其他人,因为我不会链接我浏览过的所有帖子,所以我做错了什么或者我误解了听众的作品?这是我的代码:

public class Person {
    private String name;
    private String address;
    private Integer age;

    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    public void setName(String name) {
        this.name = name;
        this.propertyChangeSupport.firePropertyChange("name", this.name, name);
    }

    public void setAddress(String address) {
        this.address = address;
        this.propertyChangeSupport.firePropertyChange("address", this.address, address);
    }

    public void setAge(Integer age) {
        this.age = age;
        this.propertyChangeSupport.firePropertyChange("age", this.age, age);
    }

}

我的监听类:

public class PersonChangeListener implements PropertyChangeListener {

    public PersonChangeListener() {
        Person person = new Person();
        person.addPropertyChangeListener(this);
    }
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        System.out.println("test");
        String value = "old value: " + evt.getOldValue() + " New value: " + evt.getNewValue();
        System.out.println(value);
    }
}

还有我的主要条目:

public class ListenerTestMain {

    public static void main(String... args) {
        Person person1 = new Person();
        person1.addPropertyChangeListener(new PersonChangeListener());
        person1.setName("Frank");
        person1.setAddress("Street 3");
        person1.setAge(26);

        Person person2 = new Person();
        person2.setName("Joe");
        person2.setAddress("Avenue Lane 3");
        person2.setAge(26);



        if (!person1.getName().equalsIgnoreCase(person2.getName())) {
            person1.setName(person2.getName());
        }

        if (!person1.getAddress().equalsIgnoreCase(person2.getAddress())) {
            person1.setAddress(person2.getAddress());
        }

        if (!person1.getAge().equals(person2.getAge())) {
            person1.setAge(person2.getAge());
        }

    }

}

因此,当我在这种情况下为 person1nameaddress 设置新值时,我希望在 PersonChangeListener 中为它们中的每一个调用 propertyChanged 方法。但这不会发生,至少我的控制台中没有输出任何内容。

是不是因为PropertyChangeListener 仅适用于某些特定的 java 库,例如 javafx 或类似的库?我必须实现自定义事件触发器吗?

【问题讨论】:

    标签: java propertychangelistener


    【解决方案1】:

    您设置属性然后调用处理程序。此时this.name(即oldValue)和name(即newValue)相等,因此事件不会触发。

    在设置值之前调用处理程序(我不建议)或使用另一个变量来保存旧值。

    【讨论】:

    • 哈哈哈谢谢@Hossein - 为什么我没有注意到对不起,应该仔细研究一下教程xD。他们甚至通过将旧值存储到局部变量中来展示它。非常感谢!现在可以了,感觉有点傻哈哈xD需要更多的咖啡。
    • 不用担心@TheLearner。发生在我们最好的人身上。
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2021-02-09
    • 2018-11-15
    • 2021-05-29
    • 2015-09-22
    • 2014-02-21
    相关资源
    最近更新 更多