home *** CD-ROM | disk | FTP | other *** search
/ Java 1.2 How-To / JavaHowTo.iso / javafile / ch06 / Doodle.java < prev    next >
Text File  |  1998-12-14  |  7KB  |  297 lines

  1. import java.applet.Applet;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4.  
  5. /**
  6.  * The ColorBar class displays a color bar for color selection.
  7.  */
  8. class ColorBar {
  9.  
  10. /*
  11.  * the top, left coordinate of the color bar
  12.  */
  13. int xpos, ypos;
  14.  
  15. /*
  16.  * the width and height of the color bar
  17.  */
  18. int width, height;
  19.  
  20. /*
  21.  * the current color selection index into the colors array
  22.  */
  23. int selectedColor = 3;
  24.  
  25. /*
  26.  * the array of colors available for selection
  27.  */
  28. static Color colors[] = {
  29.        Color.white, Color.gray, Color.red, Color.pink,
  30.        Color.orange, Color.yellow, Color.green, Color.magenta,
  31.        Color.cyan, Color.blue
  32. };
  33.  
  34. /**
  35.  * Create the color bar
  36.  */
  37. public ColorBar (int x, int y, int w, int h) {
  38.  
  39.        xpos = x;
  40.        ypos = y;
  41.        width = w;
  42.        height = h; 
  43. }
  44.  
  45. /**
  46.  * Paint the color bar
  47.  * @param g - destination graphics object
  48.  */
  49. void paint (Graphics g) {
  50.  
  51.        int x, y, i;
  52.        int w, h;
  53.  
  54.        for (i=0; i<colors.length; i+=1) {
  55.               w = width;
  56.               h = height/colors.length;
  57.               x = xpos;
  58.               y = ypos + (i * h);
  59.               g.setColor (Color.black);
  60.               g.fillRect (x, y, w, h);
  61.               if (i == selectedColor) {
  62.                      x += 5;
  63.                      y += 5;
  64.                      w -= 10;
  65.                      h -= 10;
  66.               } else {
  67.                      x += 1;
  68.                      y += 1;
  69.                      w -= 2;
  70.                      h -= 2;
  71.               }
  72.               g.setColor (colors[i]);
  73.               g.fillRect (x, y, w, h);
  74.        }
  75. }
  76.  
  77. /**
  78.  * Check to see whether the mouse is inside a palette box.
  79.  * If it is, set selectedColor and return true;
  80.  *        otherwise, return false.
  81.  * @param x, y - x and y position of mouse
  82.  */
  83. boolean inside (int x, int y) {
  84.  
  85.        int i, h;
  86.  
  87.        if (x < xpos || x > xpos+width) return false;
  88.        if (y < ypos || y > ypos+height) return false; 
  89.  
  90.        h = height/colors.length;
  91.        for (i=0; i<colors.length; i+=1) {
  92.               if (y < ((i+1)*h+ypos)) {
  93.                      selectedColor = i;
  94.                      return true;
  95.               }
  96.        }
  97.        return false;
  98. }
  99. }
  100.  
  101. /**
  102.  * The Doodle applet implements a drawable surface
  103.  * with a limited choice of colors to draw with.
  104.  */
  105. public class Doodle extends Frame {
  106.  
  107. /*
  108.  * the maximum number of points that can be
  109.  * saved in the xpoints, ypoints, and color arrays
  110.  */
  111. static final int MaxPoints = 1000;
  112.  
  113. /*
  114.  * arrays to hold the points where the user draws
  115.  */
  116. int xpoints[] = new int[MaxPoints];
  117. int ypoints[] = new int[MaxPoints]; 
  118.  
  119. /*
  120.  * the color of each point
  121.  */
  122. int color[] = new int[MaxPoints];
  123.  
  124. /*
  125.  * used to keep track of the previous mouse
  126.  * click to avoid filling arrays with the
  127.  * same point
  128.  */
  129. int lastx;
  130. int lasty;
  131.  
  132. /*
  133.  * the number of points in the arrays
  134.  */
  135. int npoints = 0;
  136. ColorBar colorBar;
  137. boolean inColorBar;
  138.  
  139. /**
  140.  * Set the window title and create the menus
  141.  * Create an instance of ColorBar
  142.  */
  143.  
  144.     public void New_Action(ActionEvent event)
  145.     {
  146.         Doodle doodle = new Doodle();
  147.     }
  148.  
  149.     public void Quit_Action(ActionEvent event)
  150.     {
  151.         System.exit(0);
  152.     }
  153.  
  154.     class ActionListener1 implements ActionListener
  155.     {
  156.         public void actionPerformed(ActionEvent event)
  157.         {
  158.             String str = event.getActionCommand();
  159.             if (str.equals("New"))
  160.                 New_Action(event);
  161.             else if (str.equals("Quit"))
  162.                 Quit_Action(event);
  163.         }
  164.     }
  165.  
  166. public Doodle () {
  167.  
  168.        setTitle ("Doodle");
  169.  
  170.        setBackground(Color.white);
  171.  
  172.        MenuBar menuBar = new MenuBar();
  173.        Menu fileMenu = new Menu("File");
  174.        fileMenu.add(new MenuItem("Open"));
  175.        fileMenu.add(new MenuItem("New"));
  176.        fileMenu.add(new MenuItem("Close"));
  177.        fileMenu.add(new MenuItem("-"));
  178.        fileMenu.add(new MenuItem("Quit"));
  179.        menuBar.add (fileMenu);
  180.  
  181.        Menu editMenu = new Menu("Edit");
  182.        editMenu.add(new MenuItem("Undo"));
  183.        editMenu.add(new MenuItem("Cut"));
  184.        editMenu.add(new MenuItem("Copy"));
  185.        editMenu.add(new MenuItem("Paste"));
  186.        editMenu.add(new MenuItem("-"));
  187.        editMenu.add(new MenuItem("Clear"));
  188.        menuBar.add (editMenu);
  189.        setMenuBar (menuBar);
  190.  
  191.        colorBar = new ColorBar (10, 75, 30, 200); 
  192.  
  193.     WindowListener1 lWindow = new WindowListener1();
  194.     addWindowListener(lWindow);
  195.  
  196.     MouseListener1 lMouse = new MouseListener1();
  197.     addMouseListener(lMouse);
  198.  
  199.     MouseMotionListener1 lMouseMotion = new MouseMotionListener1();
  200.     addMouseMotionListener(lMouseMotion);
  201.  
  202.     ActionListener1 lAction = new ActionListener1();
  203.     fileMenu.addActionListener(lAction);
  204.  
  205.        setSize (410, 430);
  206.        show ();
  207. }
  208.  
  209. class WindowListener1 extends WindowAdapter
  210. {
  211.     public void windowClosing(WindowEvent event)
  212.     {
  213.         Window win = event.getWindow();
  214.         win.setVisible(false);
  215.         win.dispose();
  216.         System.exit(0);
  217.     }
  218. }
  219.  
  220. class MouseMotionListener1 extends MouseMotionAdapter
  221. {
  222.     public void mouseDragged(MouseEvent e)
  223.     {
  224.         int x = e.getX();
  225.         int y = e.getY();
  226.               if (inColorBar) return;
  227.               if ((x != lastx || y != lasty) && npoints < MaxPoints) {
  228.                      lastx = x;
  229.                      lasty = y;
  230.                      xpoints[npoints] = x;
  231.                      ypoints[npoints] = y;
  232.                      color[npoints] = colorBar.selectedColor;
  233.                      npoints += 1; 
  234.                      repaint ();
  235.               }
  236.     }
  237. }
  238.  
  239. class MouseListener1 extends MouseAdapter
  240. {
  241.     public void mousePressed(MouseEvent e)
  242.     {
  243.         int x = e.getX();
  244.         int y = e.getY();
  245.               if (colorBar.inside (x, y)) {
  246.                      inColorBar = true;
  247.                      repaint ();
  248.                      return;
  249.               }
  250.               inColorBar = false;
  251.               if (npoints < MaxPoints) {
  252.                      lastx = x;
  253.                      lasty = y;
  254.                      xpoints[npoints] = x;
  255.                      ypoints[npoints] = y;
  256.                      color[npoints] = colorBar.selectedColor;
  257.                      npoints += 1;
  258.               }
  259.               npoints = 0;
  260.     }
  261. }
  262.  
  263. /**
  264.  * Redisplay the drawing space
  265.  * @param g - destination graphics object
  266.  */
  267. public void update (Graphics g) {
  268.  
  269.        int i;
  270.  
  271.        for (i=0; i<npoints; i+=1) {
  272.               g.setColor (colorBar.colors[color[i]]);
  273.               g.fillOval (xpoints[i]-5, ypoints[i]-5, 10, 10);
  274.        }
  275.        colorBar.paint (g);
  276. }
  277.  
  278. /**
  279.  * Repaint the drawing space when required
  280.  * @param g - destination graphics object
  281.  */
  282. public void paint (Graphics g) {
  283.  
  284.        update (g);
  285. }
  286.  
  287. /**
  288.  * The main method allows this class to be run as an application
  289.  * @param args - command-line arguments
  290.  */
  291. public static void main (String args[]) {
  292.  
  293.        Doodle doodle = new Doodle ();
  294. }
  295.  
  296. }
  297.