Вы всегда должны возвращать true
, чтобы сообщить PropertyChangeSupport
, что ваш объект не изменился. Но это означает, что equals()
не работает для всех объектов этого класса (например, вы больше не можете использовать их в наборах или картах).
Лучше было бы иметь специальный метод firePropertyChange()
для такого типа объектов, который выполняет специальную обработку. Таким образом, вы даже можете избежать создания экземпляра PropertyChangeEvent
. Вот пример для обработки BigDecimal
(где equals()
вообще не работает):
protected transient PropertyChangeSupport changeSupport = null;
public void addPropertyChangeListener (String propertyName, PropertyChangeListener listener)
{
if (changeSupport == null)
changeSupport = new PropertyChangeSupport (this);
changeSupport.addPropertyChangeListener (propertyName, listener);
}
public void firePropertyChange (String propertyName, BigDecimal oldValue, BigDecimal newValue)
{
if (changeSupport == null)
return;
if (oldValue != null && newValue != null && oldValue.compareTo (newValue) == 0) {
return;
}
changeSupport.firePropertyChange(new PropertyChangeEvent(this, propertyName,
oldValue, newValue));
}
[РЕДАКТИРОВАТЬ] То, что вы делаете, это совсем другое: у вас есть родитель и ребенок, и вы хотите, чтобы слушатели parent получали события, когда child меняется.
Правильный подход здесь - добавить PropertyChangeSupport
к child . Когда дочерний элемент добавляется к родительскому элементу, родительский компонент должен установить необходимые дочерние элементы в дочернем элементе. Когда событие вызывается, оно должно запустить второе событие, которое информирует слушателей parent об изменении child (родитель должен переслать события).