2004-10-29

畫圖小程式範例 by swanky

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

import javax.swing.*;

public class DrawCircle extends JApplet{

   boolean drawable = false;

   public void init(){
      super.init();

      getContentPane().add(new DrawPanel(), BorderLayout.CENTER);

      Action drawAction = new DrawAction();
      Action cancelAction = new CancelAction();

      JPanel p = new JPanel();
      p.add(new JButton(drawAction));
      p.add(new JButton(cancelAction));
      getContentPane().add(p, BorderLayout.NORTH);

      JMenu actionMenu = new JMenu("Action");
      actionMenu.add(drawAction);
      actionMenu.add(cancelAction);
      JMenuBar menuBar = new JMenuBar();
      menuBar.add(actionMenu);
      setJMenuBar(menuBar);
   }

   public static void main(String[] args){
      JApplet applet = new DrawCircle();
      JFrame frame = new JFrame("DrawCircle");

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(applet);

      frame.setSize(500, 500);
      applet.init();
      applet.start();
      frame.setVisible(true);
   }

   class DrawAction extends AbstractAction{
      public DrawAction(){
         putValue(Action.NAME, "Draw");
         putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl D"));
      }

      public void actionPerformed(ActionEvent e){
         drawable = true;
      }
   }

   class CancelAction extends AbstractAction{
      public CancelAction(){
         putValue(Action.NAME, "Cancel");
         putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
      }

      public void actionPerformed(ActionEvent e){
         drawable = false;
      }
   }

   class DrawPanel extends JPanel implements MouseListener, MouseMotionListener{
      Point2D p1, p2;

      public DrawPanel(){
         addMouseListener(this);
         addMouseMotionListener(this);
      }

      protected void paintComponent(Graphics g){
         super.paintComponent(g);
         Graphics2D g2d = (Graphics2D)g;

         if(drawable){
            if((p1 != null) | (p2 != null)){
               Ellipse2D e = new Ellipse2D.Double(p1.getX(), p1.getY(),
                     p2.getX() - p1.getX(), p2.getY() - p1.getY());
               g2d.draw(e);
            }
         }
      }

      public void mouseClicked(MouseEvent e){}

      public void mousePressed(MouseEvent e){
         if(drawable){
            p1 = (Point2D)e.getPoint();
         }
      }

      public void mouseReleased(MouseEvent e){
         if(drawable){
            p2 = (Point2D)e.getPoint();
            repaint();
         }
      }

      public void mouseEntered(MouseEvent e){}
      public void mouseExited(MouseEvent e){}
      public void mouseDragged(MouseEvent e){}
      public void mouseMoved(MouseEvent e){}
   }
}

沒有留言: