import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyVetoException; 
import java.beans.VetoableChangeListener; 
import java.beans.VetoableChangeSupport; 
import java.io.Externalizable; 
import java.io.IOException; 
import java.io.ObjectInput; 
import java.io.ObjectOutput; 
 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.event.EventListenerList; 
import javax.swing.event.SwingPropertyChangeSupport; 
 
public class BakedBean extends JComponent implements Externalizable { 
  // Property names 
  public static final String BEAN_VALUE = "Value"; 
 
  public static final String BEAN_COLOR = "Color"; 
 
  // Properties 
  private Font beanFont; // simple 
 
  private Dimension beanDimension; // simple 
 
  private int beanValue; // bound 
 
  private Color beanColor; // constrained 
 
  private String text; // change 
 
  // Manages all PropertyChangeListeners 
  protected SwingPropertyChangeSupport propertySupporter = new SwingPropertyChangeSupport( 
      this); 
 
  // Manages all VetoableChangeListeners 
  protected VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport(this); 
 
  protected transient ChangeEvent changeEvent = null; 
 
  protected EventListenerList listenerList = new EventListenerList(); 
 
  public BakedBean() { 
    beanFont = new Font("SanSerif", Font.BOLD | Font.ITALIC, 12); 
    beanDimension = new Dimension(150, 100); 
    beanValue = 0; 
    beanColor = Color.black; 
    text = "BakedBean #"; 
  } 
 
  public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(beanColor); 
    g.setFont(beanFont); 
    g.drawString(text + beanValue, 30, 30); 
  } 
 
  public void setBeanFont(Font font) { 
    beanFont = font; 
  } 
 
  public Font getBeanFont() { 
    return beanFont; 
  } 
 
  public void setBeanValue(int newValue) { 
    int oldValue = beanValue; 
    beanValue = newValue; 
 
    // Notify all PropertyChangeListeners 
    propertySupporter.firePropertyChange(BEAN_VALUE, new Integer(oldValue), 
        new Integer(newValue)); 
  } 
 
  public int getBeanValue() { 
    return beanValue; 
  } 
 
  public void setBeanColor(Color newColor) throws PropertyVetoException { 
    Color oldColor = beanColor; 
 
    vetoableChangeSupport.fireVetoableChange(BEAN_COLOR, oldColor, newColor); 
 
    beanColor = newColor; 
    propertySupporter.firePropertyChange(BEAN_COLOR, oldColor, newColor); 
  } 
 
  public Color getBeanColor() { 
    return beanColor; 
  } 
 
  public void setBeanString(String newString) { 
    text = newString; 
 
    // Notify all ChangeListeners 
    fireStateChanged(); 
  } 
 
  public String getBeanString() { 
    return text; 
  } 
 
  public void setPreferredSize(Dimension dim) { 
    beanDimension = dim; 
  } 
 
  public Dimension getPreferredSize() { 
    return beanDimension; 
  } 
 
  public void setMinimumSize(Dimension dim) { 
    beanDimension = dim; 
  } 
 
  public Dimension getMinimumSize() { 
    return beanDimension; 
  } 
 
  public void addPropertyChangeListener(PropertyChangeListener l) { 
    propertySupporter.addPropertyChangeListener(l); 
  } 
 
  public void removePropertyChangeListener(PropertyChangeListener l) { 
    propertySupporter.removePropertyChangeListener(l); 
  } 
 
  public void addVetoableChangeListener(VetoableChangeListener l) { 
    vetoableChangeSupport.addVetoableChangeListener(l); 
  } 
 
  public void removeVetoableChangeListener(VetoableChangeListener l) { 
    vetoableChangeSupport.removeVetoableChangeListener(l); 
  } 
 
  // Remember that EventListenerList is an array of 
  // key/value pairs. 
  // key = XXListener class reference 
  // value = XXListener instance 
  public void addChangeListener(ChangeListener l) { 
    listenerList.add(ChangeListener.class, l); 
  } 
 
  public void removeChangeListener(ChangeListener l) { 
    listenerList.remove(ChangeListener.class, l); 
  } 
 
  // EventListenerList dispatching code. 
  protected void fireStateChanged() { 
    Object[] listeners = listenerList.getListenerList(); 
    // Process the listeners last to first, notifying 
    // those that are interested in this event 
    for (int i = listeners.length - 2; i >= 0; i -= 2) { 
      if (listeners[i] == ChangeListener.class) { 
        if (changeEvent == null) 
          changeEvent = new ChangeEvent(this); 
        ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent); 
      } 
    } 
  } 
 
  public void writeExternal(ObjectOutput out) throws IOException { 
    out.writeObject(beanFont); 
    out.writeObject(beanDimension); 
    out.writeInt(beanValue); 
    out.writeObject(beanColor); 
    out.writeObject(text); 
  } 
 
  public void readExternal(ObjectInput in) throws IOException, 
      ClassNotFoundException { 
    setBeanFont((Font) in.readObject()); 
    setPreferredSize((Dimension) in.readObject()); 
    // Use preferred size for minimum size.. 
    setMinimumSize(getPreferredSize()); 
    setBeanValue(in.readInt()); 
    try { 
      setBeanColor((Color) in.readObject()); 
    } catch (PropertyVetoException pve) { 
      System.out.println("Color change vetoed.."); 
    } 
    setBeanString((String) in.readObject()); 
  } 
 
  public static void main(String[] args) { 
    JFrame frame = new JFrame("BakedBean"); 
    frame.getContentPane().add(new BakedBean()); 
    frame.setVisible(true); 
    frame.pack(); 
  } 
} 
 
 
            
          
  
  |