📄 propertychangemulticaster.java
字号:
child = (PropertyChangeMulticaster)children.get(propertyName);
if (child == null) {
child = new PropertyChangeMulticaster(source);
children.put(propertyName, child);
}
}
child.addPropertyChangeListener(listener);
}
/**
* Add a PropertyChangeListener for a specific property, if it is not
* already registered. The listener
* will be invoked only when a call on firePropertyChange names that
* specific property.
*
* @param propertyName The name of the property to listen on.
* @param listener The PropertyChangeListener to be added
* @exception NullPointerException If listener is null
*/
public void addPropertyChangeListenerIfAbsent(String propertyName,
PropertyChangeListener listener) {
logger.debug("addPropertyChangeListenerIfAbsent(propertyName=" + propertyName + ", listener=" + listener
+ ") - start");
if (listener == null) throw new NullPointerException();
PropertyChangeMulticaster child = null;
synchronized(this) {
if (children == null)
children = new HashMap();
else
child = (PropertyChangeMulticaster)children.get(propertyName);
if (child == null) {
child = new PropertyChangeMulticaster(source);
children.put(propertyName, child);
}
}
child.addPropertyChangeListenerIfAbsent(listener);
}
/**
* Remove a PropertyChangeListener for a specific property.
* Affects only the given property.
* If the listener is also registered for all properties,
* then it will continue to be registered for them.
*
* @param propertyName The name of the property that was listened on.
* @param listener The PropertyChangeListener to be removed
*/
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
logger.debug("removePropertyChangeListener(propertyName=" + propertyName + ", listener=" + listener
+ ") - start");
PropertyChangeMulticaster child = getChild(propertyName);
if (child != null)
child.removePropertyChangeListener(listener);
}
/**
* Helper method to relay evt to all listeners.
* Called by all public firePropertyChange methods.
**/
protected void multicast(PropertyChangeEvent evt) {
logger.debug("multicast(evt=" + evt + ") - start");
PropertyChangeListener[] array; // bind in synch block below
PropertyChangeMulticaster child = null;
synchronized (this) {
array = listeners;
if (children != null && evt.getPropertyName() != null)
child = (PropertyChangeMulticaster)children.get(evt.getPropertyName());
}
for (int i = 0; i < array.length; ++i)
array[i].propertyChange(evt);
if (child != null)
child.multicast(evt);
}
/**
* Report a bound property update to any registered listeners.
* No event is fired if old and new are equal and non-null.
*
* @param propertyName The programmatic name of the property
* that was changed.
* @param oldValue The old value of the property.
* @param newValue The new value of the property.
*/
public void firePropertyChange(String propertyName,
Object oldValue, Object newValue) {
logger.debug("firePropertyChange(propertyName=" + propertyName + ", oldValue=" + oldValue + ", newValue="
+ newValue + ") - start");
if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
multicast(new PropertyChangeEvent(source,
propertyName,
oldValue,
newValue));
}
}
/**
* Report an int bound property update to any registered listeners.
* No event is fired if old and new are equal and non-null.
* <p>
* This is merely a convenience wrapper around the more general
* firePropertyChange method that takes Object values.
*
* @param propertyName The programmatic name of the property
* that was changed.
* @param oldValue The old value of the property.
* @param newValue The new value of the property.
*/
public void firePropertyChange(String propertyName,
int oldValue, int newValue) {
logger.debug("firePropertyChange(propertyName=" + propertyName + ", oldValue=" + oldValue + ", newValue="
+ newValue + ") - start");
if (oldValue != newValue) {
multicast(new PropertyChangeEvent(source,
propertyName,
new Integer(oldValue),
new Integer(newValue)));
}
}
/**
* Report a boolean bound property update to any registered listeners.
* No event is fired if old and new are equal and non-null.
* <p>
* This is merely a convenience wrapper around the more general
* firePropertyChange method that takes Object values.
*
* @param propertyName The programmatic name of the property
* that was changed.
* @param oldValue The old value of the property.
* @param newValue The new value of the property.
*/
public void firePropertyChange(String propertyName,
boolean oldValue, boolean newValue) {
logger.debug("firePropertyChange(propertyName=" + propertyName + ", oldValue=" + oldValue + ", newValue="
+ newValue + ") - start");
if (oldValue != newValue) {
multicast(new PropertyChangeEvent(source,
propertyName,
new Boolean(oldValue),
new Boolean(newValue)));
}
}
/**
* Fire an existing PropertyChangeEvent to any registered listeners.
* No event is fired if the given event's old and new values are
* equal and non-null.
* @param evt The PropertyChangeEvent object.
*/
public void firePropertyChange(PropertyChangeEvent evt) {
logger.debug("firePropertyChange(evt=" + evt + ") - start");
Object oldValue = evt.getOldValue();
Object newValue = evt.getNewValue();
if (oldValue == null || newValue == null || !oldValue.equals(newValue))
multicast(evt);
}
/**
* Check if there are any listeners for a specific property.
* If propertyName is null, return whether there are any listeners at all.
*
* @param propertyName the property name.
* @return true if there are one or more listeners for the given property
*
*/
public boolean hasListeners(String propertyName) {
logger.debug("hasListeners(propertyName=" + propertyName + ") - start");
PropertyChangeMulticaster child;
synchronized (this) {
if (listeners.length > 0)
return true;
else if (propertyName == null || children == null)
return false;
else {
child = (PropertyChangeMulticaster)children.get(propertyName);
if (child == null)
return false;
}
}
return child.hasListeners(null);
}
/**
* @serialData Null terminated list of <code>PropertyChangeListeners</code>.
* <p>
* At serialization time we skip non-serializable listeners and
* only serialize the serializable listeners.
*
*/
private synchronized void writeObject(ObjectOutputStream s) throws IOException {
logger.debug("writeObject(s=" + s + ") - start");
s.defaultWriteObject();
for (int i = 0; i < listeners.length; i++) {
if (listeners[i] instanceof Serializable) {
s.writeObject(listeners[i]);
}
}
s.writeObject(null);
}
private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException {
logger.debug("readObject(s=" + s + ") - start");
listeners = new PropertyChangeListener[0]; // paranoically reset
s.defaultReadObject();
Object listenerOrNull;
while (null != (listenerOrNull = s.readObject())) {
addPropertyChangeListener((PropertyChangeListener)listenerOrNull);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -