📄 vetoablechangesupport.java
字号:
{ if (children == null) return; VetoableChangeSupport s = (VetoableChangeSupport) children.get(propertyName); if (s == null) return; while (l instanceof VetoableChangeListenerProxy) { VetoableChangeListenerProxy p = (VetoableChangeListenerProxy) l; if (propertyName == null ? p.propertyName != null : ! propertyName.equals(p.propertyName)) return; l = (VetoableChangeListener) p.getListener(); } s.listeners.remove(l); if (s.listeners.isEmpty()) { children.remove(propertyName); if (children.isEmpty()) children = null; } } /** * Returns an array of all vetoable change listeners registered under the * given property name. If there are no registered listeners, this returns * an empty array. * * @return the array of registered listeners * @throws NullPointerException if propertyName is null * @since 1.4 */ public synchronized VetoableChangeListener[] getVetoableChangeListeners(String propertyName) { if (children == null) return new VetoableChangeListener[0]; VetoableChangeSupport s = (VetoableChangeSupport) children.get(propertyName); if (s == null) return new VetoableChangeListener[0]; return (VetoableChangeListener[]) s.listeners.toArray(new VetoableChangeListener[s.listeners.size()]); } /** * Fire a PropertyChangeEvent containing the old and new values of the * property to all the global listeners, and to all the listeners for the * specified property name. This does nothing if old and new are non-null * and equal. If the change is vetoed, a new event is fired to notify * listeners about the rollback before the exception is thrown. * * @param propertyName the name of the property that changed * @param oldVal the old value * @param newVal the new value * @throws PropertyVetoException if the change is vetoed by a listener */ public void fireVetoableChange(String propertyName, Object oldVal, Object newVal) throws PropertyVetoException { fireVetoableChange(new PropertyChangeEvent(source, propertyName, oldVal, newVal)); } /** * Fire a PropertyChangeEvent containing the old and new values of the * property to all the global listeners, and to all the listeners for the * specified property name. This does nothing if old and new are equal. * If the change is vetoed, a new event is fired to notify listeners about * the rollback before the exception is thrown. * * @param propertyName the name of the property that changed * @param oldVal the old value * @param newVal the new value * @throws PropertyVetoException if the change is vetoed by a listener */ public void fireVetoableChange(String propertyName, int oldVal, int newVal) throws PropertyVetoException { if (oldVal != newVal) fireVetoableChange(new PropertyChangeEvent(source, propertyName, new Integer(oldVal), new Integer(newVal))); } /** * Fire a PropertyChangeEvent containing the old and new values of the * property to all the global listeners, and to all the listeners for the * specified property name. This does nothing if old and new are equal. * If the change is vetoed, a new event is fired to notify listeners about * the rollback before the exception is thrown. * * @param propertyName the name of the property that changed * @param oldVal the old value * @param newVal the new value * @throws PropertyVetoException if the change is vetoed by a listener */ public void fireVetoableChange(String propertyName, boolean oldVal, boolean newVal) throws PropertyVetoException { if (oldVal != newVal) fireVetoableChange(new PropertyChangeEvent(source, propertyName, Boolean.valueOf(oldVal), Boolean.valueOf(newVal))); } /** * Fire a PropertyChangeEvent to all the global listeners, and to all the * listeners for the specified property name. This does nothing if old and * new values of the event are equal. If the change is vetoed, a new event * is fired to notify listeners about the rollback before the exception is * thrown. * * @param event the event to fire * @throws NullPointerException if event is null * @throws PropertyVetoException if the change is vetoed by a listener */ public void fireVetoableChange(PropertyChangeEvent event) throws PropertyVetoException { if (event.oldValue != null && event.oldValue.equals(event.newValue)) return; Vector v = listeners; // Be thread-safe. if (v != null) { int i = v.size(); try { while (--i >= 0) ((VetoableChangeListener) v.get(i)).vetoableChange(event); } catch (PropertyVetoException e) { event = event.rollback(); int limit = i; i = v.size(); while (--i >= limit) ((VetoableChangeListener) v.get(i)).vetoableChange(event); throw e; } } Hashtable h = children; // Be thread-safe. if (h != null && event.propertyName != null) { VetoableChangeSupport s = (VetoableChangeSupport) h.get(event.propertyName); if (s != null) { Vector v1 = s.listeners; // Be thread-safe. int i = v1 == null ? 0 : v1.size(); try { while (--i >= 0) ((VetoableChangeListener) v1.get(i)).vetoableChange(event); } catch (PropertyVetoException e) { event = event.rollback(); int limit = i; i = v.size(); while (--i >= 0) ((VetoableChangeListener) v.get(i)).vetoableChange(event); i = v1.size(); while (--i >= limit) ((VetoableChangeListener) v1.get(i)).vetoableChange(event); throw e; } } } } /** * Tell whether the specified property is being listened on or not. This * will only return <code>true</code> if there are listeners on all * properties or if there is a listener specifically on this property. * * @param propertyName the property that may be listened on * @return whether the property is being listened on * @throws NullPointerException if propertyName is null */ public synchronized boolean hasListeners(String propertyName) { return listeners != null || (children != null && children.get(propertyName) != null); } /** * Saves the state of the object to the stream. * * @param s the stream to write to * @throws IOException if anything goes wrong * @serialData this writes out a null-terminated list of serializable * global vetoable change listeners (the listeners for a named * property are written out as the global listeners of the * children, when the children hashtable is saved) */ private synchronized void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); if (listeners != null) { int i = listeners.size(); while (--i >= 0) if (listeners.get(i) instanceof Serializable) s.writeObject(listeners.get(i)); } s.writeObject(null); } /** * Reads the object back from stream (deserialization). * * XXX Since serialization for 1.1 streams was not documented, this may * not work if vetoableChangeSupportSerializedDataVersion is 1. * * @param s the stream to read from * @throws IOException if reading the stream fails * @throws ClassNotFoundException if deserialization fails * @serialData this reads in a null-terminated list of serializable * global vetoable change listeners (the listeners for a named * property are written out as the global listeners of the * children, when the children hashtable is saved) */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); VetoableChangeListener l = (VetoableChangeListener) s.readObject(); while (l != null) { addVetoableChangeListener(l); l = (VetoableChangeListener) s.readObject(); } // Sun is not as careful with children as we are, and lets some proxys // in that can never receive events. So, we clean up anything that got // serialized, to make sure our invariants hold. if (children != null) { int i = children.size(); Iterator iter = children.entrySet().iterator(); while (--i >= 0) { Entry e = (Entry) iter.next(); String name = (String) e.getKey(); VetoableChangeSupport vcs = (VetoableChangeSupport) e.getValue(); if (vcs.listeners == null) vcs.listeners = new Vector(); if (vcs.children != null) vcs.listeners.addAll (Arrays.asList(vcs.getVetoableChangeListeners(name))); if (vcs.listeners.size() == 0) iter.remove(); else vcs.children = null; } if (children.size() == 0) children = null; } }} // class VetoableChangeSupport
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -