【问题标题】:Cyclic Property Change Listeners循环属性更改监听器
【发布时间】:2013-06-28 11:24:12
【问题描述】:

我设置了一个循环属性更改侦听器。我有 2 个 A 类对象。我让一个对象监听另一个对象的变化,反之亦然。代码如下:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CyclicPCLTest {

    public static class A implements PropertyChangeListener{
       private PropertyChangeSupport propertyChangeSupport;
       private String date;

        public A(String date) {
            this.date = date;
            propertyChangeSupport=new PropertyChangeSupport(this);
        }

        public String getDate() {
           return date;
       }

       public void setDate(String date) {
           String oldDate=this.date;
           this.date = date;
           propertyChangeSupport.firePropertyChange(new PropertyChangeEvent(this, "date", oldDate, this.date));
       }

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

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            setDate ((String) evt.getNewValue());
        }
    }


    public static void main(String[] args) {
        List<A> as= Arrays.asList(new A[]{new A("01/02/2011"), new A("01/02/2011")});
        as.get(0).addPropertyChangeListener(as.get(1));
        as.get(1).addPropertyChangeListener(as.get(0));

        as.get(0).setDate("02/02/2011");
        System.out.println("date of the other A "+as.get(1).getDate());

        as.get(1).setDate("03/02/2011");
        System.out.println("date of the other A "+as.get(0).getDate());
    }
}

代码有效,这是输出:

date of the other A 02/02/2011
date of the other A 03/02/2011

我想知道它是怎么做的?它不应该给我一个stackoverflow错误吗?当第一个 A 更新时,它会通知第二个 A,然后第二个 A 会更新并通知第一个 A。这应该永远持续下去。

【问题讨论】:

  • 你调试和测试了吗?

标签: java propertychangelistener propertychangesupport


【解决方案1】:

那是因为firePropertyChange 只会在oldValue 不等于newValue 时触发事件

2次递归运行后,当代码到达

propertyChangeSupport.firePropertyChange(new PropertyChangeEvent(this, "date", oldDate, this.date));

oldDatethis.date 本质上变得相同(即 oldDate.equals(this.date) == true )并且它不会将事件传播给侦听器

查看firePropertyChange方法的文档

向任何已注册的侦听器触发现有的 PropertyChangeEvent。 没有 如果给定事件的旧值和新值 相等 并且 非空。

【讨论】:

  • 啊..我怎么错过了!谢谢
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多