001 /*
002 * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package javax.swing.event;
027
028 import java.beans.PropertyChangeSupport;
029 import java.beans.PropertyChangeEvent;
030
031 import javax.swing.SwingUtilities;
032
033 /**
034 * This subclass of {@code java.beans.PropertyChangeSupport} is almost
035 * identical in functionality. The only difference is if constructed with
036 * {@code SwingPropertyChangeSupport(sourceBean, true)} it ensures
037 * listeners are only ever notified on the <i>Event Dispatch Thread</i>.
038 *
039 * @version 1.29 05/05/07
040 * @author Igor Kushnirskiy
041 */
042
043 public final class SwingPropertyChangeSupport extends
044 PropertyChangeSupport {
045
046 /**
047 * Constructs a SwingPropertyChangeSupport object.
048 *
049 * @param sourceBean The bean to be given as the source for any
050 * events.
051 * @throws NullPointerException if {@code sourceBean} is
052 * {@code null}
053 */
054 public SwingPropertyChangeSupport(Object sourceBean) {
055 this (sourceBean, false);
056 }
057
058 /**
059 * Constructs a SwingPropertyChangeSupport object.
060 *
061 * @param sourceBean the bean to be given as the source for any events
062 * @param notifyOnEDT whether to notify listeners on the <i>Event
063 * Dispatch Thread</i> only
064 *
065 * @throws NullPointerException if {@code sourceBean} is
066 * {@code null}
067 * @since 1.6
068 */
069 public SwingPropertyChangeSupport(Object sourceBean,
070 boolean notifyOnEDT) {
071 super (sourceBean);
072 this .notifyOnEDT = notifyOnEDT;
073 }
074
075 /**
076 * {@inheritDoc}
077 *
078 * <p>
079 * If {@link #isNotifyOnEDT} is {@code true} and called off the
080 * <i>Event Dispatch Thread</i> this implementation uses
081 * {@code SwingUtilities.invokeLater} to send out the notification
082 * on the <i>Event Dispatch Thread</i>. This ensures listeners
083 * are only ever notified on the <i>Event Dispatch Thread</i>.
084 *
085 * @throws NullPointerException if {@code evt} is
086 * {@code null}
087 * @since 1.6
088 */
089 public void firePropertyChange(final PropertyChangeEvent evt) {
090 if (evt == null) {
091 throw new NullPointerException();
092 }
093 if (!isNotifyOnEDT() || SwingUtilities.isEventDispatchThread()) {
094 super .firePropertyChange(evt);
095 } else {
096 SwingUtilities.invokeLater(new Runnable() {
097 public void run() {
098 firePropertyChange(evt);
099 }
100 });
101 }
102 }
103
104 /**
105 * Returns {@code notifyOnEDT} property.
106 *
107 * @return {@code notifyOnEDT} property
108 * @see #SwingPropertyChangeSupport(Object sourceBean, boolean notifyOnEDT)
109 * @since 1.6
110 */
111 public final boolean isNotifyOnEDT() {
112 return notifyOnEDT;
113 }
114
115 // Serialization version ID
116 static final long serialVersionUID = 7162625831330845068L;
117
118 /**
119 * whether to notify listeners on EDT
120 *
121 * @serial
122 * @since 1.6
123 */
124 private final boolean notifyOnEDT;
125 }
|