|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.jdesktop.beans.AbstractBean
public abstract class AbstractBean
A convenience class from which to extend all non-visual AbstractBeans. It manages the PropertyChange notification system, making it relatively trivial to add support for property change events in getters/setters.
A non-visual java bean is a Java class that conforms to the AbstractBean patterns to allow visual manipulation of the bean's properties and event handlers at design-time.
Here is a simple example bean that contains one property, foo, and the proper pattern for implementing property change notification:
public class ABean extends AbstractBean {
private String foo;
public void setFoo(String newFoo) {
String old = getFoo();
this.foo = newFoo;
firePropertyChange("foo", old, getFoo());
}
public String getFoo() {
return foo;
}
}
You will notice that "getFoo()" is used in the setFoo method rather than accessing "foo" directly for the gets. This is done intentionally so that if a subclass overrides getFoo() to return, for instance, a constant value the property change notification system will continue to work properly.
The firePropertyChange method takes into account the old value and the new value. Only if the two differ will it fire a property change event. So you can be assured from the above code fragment that a property change event will only occur if old is indeed different from getFoo()
AbstractBean
also supports vetoable
PropertyChangeEvent
events. These events are similar to
PropertyChange
events, except a special exception can be used
to veto changing the property. For example, perhaps the property is changing
from "fred" to "red", but a listener deems that "red" is unexceptable. In
this case, the listener can fire a veto exception and the property must
remain "fred". For example:
public class ABean extends AbstractBean {
private String foo;
public void setFoo(String newFoo) throws PropertyVetoException {
String old = getFoo();
this.foo = newFoo;
fireVetoableChange("foo", old, getFoo());
}
public String getFoo() {
return foo;
}
}
public class Tester {
public static void main(String... args) {
try {
ABean a = new ABean();
a.setFoo("fred");
a.addVetoableChangeListener(new VetoableChangeListener() {
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
if ("red".equals(evt.getNewValue()) {
throw new PropertyVetoException("Cannot be red!", evt);
}
}
}
a.setFoo("red");
} catch (Exception e) {
e.printStackTrace(); // this will be executed
}
}
}
AbstractBean
is not Serializable
. Special care must
be taken when creating Serializable
subclasses, as the
Serializable
listeners will not be saved. Subclasses will need to
manually save the serializable listeners. The AbstractSerializableBean
is Serializable
and already handles the listeners correctly. If
possible, it is recommended that Serializable
beans should extend
AbstractSerializableBean
. If it is not possible, the
AbstractSerializableBean
bean implementation provides details on
how to correctly serialize an AbstractBean
subclass.
AbstractSerializableBean
Method Summary | |
---|---|
void |
addPropertyChangeListener(java.beans.PropertyChangeListener listener)
Add a PropertyChangeListener to the listener list. |
void |
addPropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
Add a PropertyChangeListener for a specific property. |
void |
addVetoableChangeListener(java.lang.String propertyName,
java.beans.VetoableChangeListener listener)
Add a VetoableChangeListener for a specific property. |
void |
addVetoableChangeListener(java.beans.VetoableChangeListener listener)
Add a VetoableListener to the listener list. |
java.lang.Object |
clone()
|
java.beans.PropertyChangeListener[] |
getPropertyChangeListeners()
Returns an array of all the listeners that were added to the PropertyChangeSupport object with addPropertyChangeListener(). |
java.beans.PropertyChangeListener[] |
getPropertyChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property. |
java.beans.VetoableChangeListener[] |
getVetoableChangeListeners()
Returns the list of VetoableChangeListeners. |
java.beans.VetoableChangeListener[] |
getVetoableChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property. |
void |
removePropertyChangeListener(java.beans.PropertyChangeListener listener)
Remove a PropertyChangeListener from the listener list. |
void |
removePropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
Remove a PropertyChangeListener for a specific property. |
void |
removeVetoableChangeListener(java.lang.String propertyName,
java.beans.VetoableChangeListener listener)
Remove a VetoableChangeListener for a specific property. |
void |
removeVetoableChangeListener(java.beans.VetoableChangeListener listener)
Remove a VetoableChangeListener from the listener list. |
Methods inherited from class java.lang.Object |
---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method Detail |
---|
public final void addPropertyChangeListener(java.beans.PropertyChangeListener listener)
listener
is null, no exception is thrown and no action
is taken.
listener
- The PropertyChangeListener to be addedpublic final void removePropertyChangeListener(java.beans.PropertyChangeListener listener)
listener
was added more than once to the same event
source, it will be notified one less time after being removed.
If listener
is null, or was never added, no exception is
thrown and no action is taken.
listener
- The PropertyChangeListener to be removedpublic final java.beans.PropertyChangeListener[] getPropertyChangeListeners()
If some listeners have been added with a named property, then
the returned array will be a mixture of PropertyChangeListeners
and PropertyChangeListenerProxy
s. If the calling
method is interested in distinguishing the listeners then it must
test each element to see if it's a
PropertyChangeListenerProxy
, perform the cast, and examine
the parameter.
PropertyChangeListener[] listeners = bean.getPropertyChangeListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof PropertyChangeListenerProxy) { PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy)listeners[i]; if (proxy.getPropertyName().equals("foo")) { // proxy is a PropertyChangeListener which was associated // with the property named "foo" } } }
PropertyChangeListeners
added or an
empty array if no listeners have been addedPropertyChangeListenerProxy
public final void addPropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
propertyName
or listener
is null, no
exception is thrown and no action is taken.
propertyName
- The name of the property to listen on.listener
- The PropertyChangeListener to be addedpublic final void removePropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
listener
was added more than once to the same event
source for the specified property, it will be notified one less time
after being removed.
If propertyName
is null, no exception is thrown and no
action is taken.
If listener
is null, or was never added for the specified
property, no exception is thrown and no action is taken.
propertyName
- The name of the property that was listened on.listener
- The PropertyChangeListener to be removedpublic final java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String propertyName)
propertyName
- The name of the property being listened to
PropertyChangeListeners
associated with
the named property. If no such listeners have been added,
or if propertyName
is null, an empty array is
returned.public final void addVetoableChangeListener(java.beans.VetoableChangeListener listener)
listener
is null, no exception is thrown and no action
is taken.
listener
- The VetoableChangeListener to be addedpublic final void removeVetoableChangeListener(java.beans.VetoableChangeListener listener)
listener
was added more than once to the same event
source, it will be notified one less time after being removed.
If listener
is null, or was never added, no exception is
thrown and no action is taken.
listener
- The VetoableChangeListener to be removedpublic final java.beans.VetoableChangeListener[] getVetoableChangeListeners()
public final void addVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
propertyName
or listener
is null, no
exception is thrown and no action is taken.
propertyName
- The name of the property to listen on.listener
- The VetoableChangeListener to be addedpublic final void removeVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
listener
was added more than once to the same event
source for the specified property, it will be notified one less time
after being removed.
If propertyName
is null, no exception is thrown and no
action is taken.
If listener
is null, or was never added for the specified
property, no exception is thrown and no action is taken.
propertyName
- The name of the property that was listened on.listener
- The VetoableChangeListener to be removedpublic final java.beans.VetoableChangeListener[] getVetoableChangeListeners(java.lang.String propertyName)
propertyName
- The name of the property being listened to
VetoableChangeListeners
associated with
the named property. If no such listeners have been added,
or if propertyName
is null, an empty array is
returned.public java.lang.Object clone() throws java.lang.CloneNotSupportedException
clone
in class java.lang.Object
java.lang.CloneNotSupportedException
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |