Language Basics Java

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
import java.io.Externalizable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import javax.swing.event.SwingPropertyChangeSupport;
public class BeanContainer extends JFrame implements FocusListener {
  protected File currentDir = new File(".");
  protected Component currentBean;
  protected String className = "MyBean";
  protected JFileChooser fileChooser = new JFileChooser();
  public BeanContainer() {
    super("Simple Bean Container");
    getContentPane().setLayout(new FlowLayout());
    setSize(300, 300);
    JPopupMenu.setDefaultLightWeightPopupEnabled(false);
    JMenuBar menuBar = createMenuBar();
    setJMenuBar(menuBar);
    WindowListener wndCloser = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    };
    addWindowListener(wndCloser);
    setVisible(true);
  }
  protected JMenuBar createMenuBar() {
    JMenuBar menuBar = new JMenuBar();
    JMenu mFile = new JMenu("File");
    JMenuItem mItem = new JMenuItem("New...");
    ActionListener lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        NewBeanThread t = new NewBeanThread();  
        t.start();
      }
    };
    mItem.addActionListener(lst);
    mFile.add(mItem);
    mItem = new JMenuItem("Load...");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        LoadBeanThread t = new LoadBeanThread();
        t.start();
      }
    };
    mItem.addActionListener(lst);
    mFile.add(mItem);
    mItem = new JMenuItem("Save...");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        SaveBeanThread t = new SaveBeanThread();  
        t.start();
      }
    };
    mItem.addActionListener(lst);
    mFile.add(mItem);
    mFile.addSeparator();
    mItem = new JMenuItem("Exit");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.exit(0);
      }
    };
    mItem.addActionListener(lst);
    mFile.add(mItem);
    menuBar.add(mFile);
    JMenu mEdit = new JMenu("Edit");
    mItem = new JMenuItem("Delete");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        if (currentBean == null)
          return;
        getContentPane().remove(currentBean);
        currentBean = null;
        validate();
        repaint();
      }
    };
    mItem.addActionListener(lst);
    mEdit.add(mItem);
    menuBar.add(mEdit);
    JMenu mLayout = new JMenu("Layout");
    ButtonGroup group = new ButtonGroup();
    mItem = new JRadioButtonMenuItem("FlowLayout");
    mItem.setSelected(true);
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        getContentPane().setLayout(new FlowLayout());
        validate();
        repaint();
      }
    };
    mItem.addActionListener(lst);
    group.add(mItem);
    mLayout.add(mItem);
    mItem = new JRadioButtonMenuItem("GridLayout");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        int col = 3;
        int row = (int) Math.ceil(getContentPane().getComponentCount()
            / (double) col);
        getContentPane().setLayout(new GridLayout(row, col, 10, 10));
        validate();
        repaint();
      }
    };
    mItem.addActionListener(lst);
    group.add(mItem);
    mLayout.add(mItem);
    mItem = new JRadioButtonMenuItem("BoxLayout - X");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        getContentPane().setLayout(
            new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
        validate();
        repaint();
      }
    };
    mItem.addActionListener(lst);
    group.add(mItem);
    mLayout.add(mItem);
    mItem = new JRadioButtonMenuItem("BoxLayout - Y");
    lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        getContentPane().setLayout(
            new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        validate();
        repaint();
      }
    };
    mItem.addActionListener(lst);
    group.add(mItem);
    mLayout.add(mItem);
    group.add(mItem);
    mLayout.add(mItem);
    menuBar.add(mLayout);
    return menuBar;
  }
  public void focusGained(FocusEvent e) {
    currentBean = e.getComponent();
    repaint();
  }
  public void focusLost(FocusEvent e) {
  }
  // This is a heavyweight component so we override paint
  // instead of paintComponent. super.paint(g) will
  // paint all child components first, and then we
  // simply draw over top of them.
  public void paint(Graphics g) {
    super.paint(g);
    if (currentBean == null)
      return;
    Point pt = getLocationOnScreen();
    Point pt1 = currentBean.getLocationOnScreen();
    int x = pt1.x - pt.x - 2;
    int y = pt1.y - pt.y - 2;
    int w = currentBean.getWidth() + 2;
    int h = currentBean.getHeight() + 2;
    g.setColor(Color.black);
    g.drawRect(x, y, w, h);
  }
  public static void main(String argv[]) {
    new BeanContainer();
  }
  class SaveBeanThread extends Thread {
    public void run() {
      if (currentBean == null)
        return;
      fileChooser
          .setDialogTitle("Please choose file to serialize bean");
      fileChooser.setCurrentDirectory(currentDir);
      int result = fileChooser
          .showSaveDialog(BeanContainer.this);
      repaint();
      if (result != JFileChooser.APPROVE_OPTION)
        return;
      currentDir = fileChooser.getCurrentDirectory();
      File fChoosen = fileChooser.getSelectedFile();
      try {
        FileOutputStream fStream = new FileOutputStream(
            fChoosen);
        ObjectOutput stream = new ObjectOutputStream(
            fStream);
        stream.writeObject(currentBean);
        stream.close();
        fStream.close();
      } catch (Exception ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(BeanContainer.this,
            "Error: " + ex.toString(), "Warning",
            JOptionPane.WARNING_MESSAGE);
      }
    }
  }
  class LoadBeanThread extends Thread{
    public void run() {
      fileChooser.setCurrentDirectory(currentDir);
      fileChooser
          .setDialogTitle("Please select file with serialized bean");
      int result = fileChooser
          .showOpenDialog(BeanContainer.this);
      repaint();
      if (result != JFileChooser.APPROVE_OPTION)
        return;
      currentDir = fileChooser.getCurrentDirectory();
      File fChoosen = fileChooser.getSelectedFile();
      try {
        FileInputStream fStream = new FileInputStream(
            fChoosen);
        ObjectInput stream = new ObjectInputStream(fStream);
        Object obj = stream.readObject();
        if (obj instanceof Component) {
          currentBean = (Component) obj;
          currentBean
              .addFocusListener(BeanContainer.this);
          currentBean.requestFocus();
          getContentPane().add(currentBean);
        }
        stream.close();
        fStream.close();
        validate();
      } catch (Exception ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(BeanContainer.this,
            "Error: " + ex.toString(), "Warning",
            JOptionPane.WARNING_MESSAGE);
      }
      repaint();
    }
  }
  class NewBeanThread extends Thread {
    public void run() {
      String result = (String) JOptionPane.showInputDialog(
          BeanContainer.this,
          "Use the following name for demanstration",
          "Input", JOptionPane.INFORMATION_MESSAGE, null,
          null, className);
      repaint();
      if (result == null)
        return;
      try {
        className = result;
        Class cls = Class.forName(result);
        Object obj = cls.newInstance();
        if (obj instanceof Component) {
          currentBean = (Component) obj;
          currentBean
              .addFocusListener(BeanContainer.this);
          currentBean.requestFocus();
          getContentPane().add(currentBean);
        }
        validate();
      } catch (Exception ex) {
        ex.printStackTrace();
        JOptionPane.showMessageDialog(BeanContainer.this,
            "Error: " + ex.toString(), "Warning",
            JOptionPane.WARNING_MESSAGE);
      }
    }
  }
}
class MyBean 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 MyBean() {
    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 MyBean());
    frame.setVisible(true);
    frame.pack();
  }
}