This example illustrates constrained properties, bound properties, and icon customization.
An object with constrained properties allows other objects to veto a constrained property change. Constrained property listeners can veto a change by throwing a PropertyVetoException. JellyBean has a constrained property called PriceInCents.
A bound property notifies other objects when its value changes. Each time its value is changed, the property fires a PropertyChange event which contains the property name, the old value, and the new value. JellyBean has a bound property called Color.
package sunw.demo.jelly; import java.awt.*; import java.beans.*; public class JellyBean extends Canvas { /** * Construct a smallish JellyBean. */ public JellyBean() { setSize(60,40); } public void paint(Graphics g) { g.setColor(ourColor); g.fillArc(5, 5, 30, 30, 0, 360); g.fillArc(25, 5, 30, 30, 0, 360); g.fillRect(20, 5, 20, 30); } /** * Returns the color that the jelly bean is rendered with. * @see #setColor */ public synchronized Color getColor() { return ourColor; } /** * Sets the color that the jelly bean is rendered with. This is a * bound property. * @see #getColor */ public void setColor(Color newColor) { Color oldColor = ourColor; ourColor = newColor;
changes.firePropertyChange("color", oldColor, newColor);
repaint(); } /** * Returns the current price. * @see #setPriceInCents */ public synchronized int getPriceInCents() { return ourPriceInCents; } /** * Set the price in cents unless one of the VetoableChangeListeners * throws a PropertyVetoException. This is a constrained property. * * @exception PropertyVetoException if the proposed price was vetoed */ public void setPriceInCents(int newPriceInCents) throws PropertyVetoException { int oldPriceInCents = ourPriceInCents; // First tell the vetoers about the change. If anyone objects, we // don't catch the exception but just let if pass on to our caller. vetos.fireVetoableChange("priceInCents", new Integer(oldPriceInCents), new Integer(newPriceInCents)); // No-one vetoed, so go ahead and make the change. ourPriceInCents = newPriceInCents; changes.firePropertyChange("priceInCents", new Integer(oldPriceInCents), new Integer(newPriceInCents)); } //---------------------------------------------------------------------- // Methods for registering listeners: /** * The specified PropertyChangeListeners propertyChange method will * be called each time the value of any bound property is changed. * The PropertyListener object is addded to a list of PropertyChangeListeners * managed by the JellyBean, it can be removed with removePropertyChangeListener. * Note: the JavaBeans specification does not require PropertyChangeListeners * to run in any particular order. * * @see #removePropertyChangeListener * @param l the PropertyChangeListener */ public void addPropertyChangeListener(PropertyChangeListener l) { changes.addPropertyChangeListener(l); } /** * Remove this PropertyChangeListener from the JellyBeans internal list. * If the PropertyChangeListener isn't on the list, silently do nothing. * * @see #addPropertyChangeListener * @param l the PropertyChangeListener */ public void removePropertyChangeListener(PropertyChangeListener l) { changes.removePropertyChangeListener(l); } /** * The specified VetoableChangeListeners vetoableChange method will * be called each time the value of any constrained property is changed. * Currently, the only constrained property is "priceInCents". * The VetoableChangeListener object is addded to a list of VetoableChangeListeners * managed by the JellyBean, it can be removed with removeVetoableChangeListener. * Note: the JavaBeans specification does not require VetoableChangeListeners * to run in any particular order. * * @see #removeVetoableChangeListener * @param l the VetoableChangeListener */ public void addVetoableChangeListener(VetoableChangeListener l) { vetos.addVetoableChangeListener(l); } /** * Remove this VetoableChangeListener from the JellyBeans internal list. * If the VetoableChangeListener isn't on the list, silently do nothing. * * @see #addVetoableChangeListener * @param l the VetoableChangeListener */ public void removeVetoableChangeListener(VetoableChangeListener l) { vetos.removeVetoableChangeListener(l); } //---------------------------------------------------------------------- // Private data fields: private PropertyChangeSupport changes = new PropertyChangeSupport(this); private VetoableChangeSupport vetos = new VetoableChangeSupport(this); private Color ourColor = Color.orange; private int ourPriceInCents = 2; }
Java, JavaBeans, and JavaSoft are trademarks of Sun Microsystems Inc.
Copyright ©
1996 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA 94043-1100 USA.
All rights reserved.