SSISO Community

시소당

Simple Java bean container

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();
    }
}

914 view

4.0 stars