# Java: Example - Circles

| This applet/application on the left draws random circles where the mouse is clicked. Try it. The main program shows how to write a program that can be run as both an application and an applet. A subclass of JComponent is defined to listen to mouse clicks and draw random circles. The third file is used to represent and draw a circle.

## The applet / main program

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
    // File   : CircleMain.java - Applet/main program
    // Purpose: Illustrate the following:
    //          * A program that is both an applet and an application.
    //          * How to do graphics by subclassing JComponent.
    //          * Implementing a mouse listener.
    // Tag: <applet code="CircleMain.class" width="200" height="200"></applet>
    // Author : Fred Swartz - 2006-11-30 - Placed in public domain.

    import java.awt.*;
    import javax.swing.*;

    ///////////////////////////////////////////////////////////// CircleMain
    public class CircleMain extends JApplet {

        //====================================================== constructor
        public CircleMain() {
            //... Set layout and add our new component.
            setLayout(new BorderLayout());
            add(new CirclePanel(200), BorderLayout.CENTER);
        }

        //============================================================= main
        public static void main(String[] args) {
            JFrame window = new JFrame("Circles");
            window.setContentPane(new CircleMain());
            window.pack();
            window.setLocationRelativeTo(null);         // Center window.
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setResizable(false);
            window.setVisible(true);
        }
    }

## Defining our own graphics component

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
    // File   : CirclePanel.java - Draws random circles where mouse clicked.
    // Purpose: Show how to define a component to display graphics and
    //          use a mouse listener.
    //
    // Issues : What's a little strange is that this component simply records
    //          the generated circles in an ArrayList in itself.
    //          What would normally happen is that the user interaction would
    //          change a "model", the logic of the program.  The model would
    //          be a separate object that represented the logical structure
    //          that the user is manipulating.  The closest that this small
    //          brain-dead application comes to a model is the ArrayList of
    //          circles.
    // Author : Fred Swartz - 2006-11-30 - Placed in the public domain.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;

    //////////////////////////////////////////////////////////////// CirclePanel
    public class CirclePanel extends JComponent implements MouseListener {
        //=============================================================== fields
        private int               _size;     // Height/width of component.
        private ArrayList<Circle> _circles = new ArrayList<Circle>();

        //========================================================== constructor
        public CirclePanel(int size) {
            _size = size;
            setPreferredSize(new Dimension(_size, _size));
            addMouseListener(this);  // This component listens to mouse events.
        }

        //======================================================== paintComponent
        @Override public void paintComponent(Graphics g) {
            //... Draw background.
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, _size, _size);

            //... Draw each of the circles.
            for (Circle c : _circles) {
                c.draw(g);
            }
        }

        //====================================================== mouse listeners
        //... Ignore all mouse events except mouseClicked.
        public void mousePressed(MouseEvent e)  {}
        public void mouseReleased(MouseEvent e) {}
        public void mouseEntered(MouseEvent e)  {}
        public void mouseExited(MouseEvent e)   {}

        public void mouseClicked(MouseEvent e) {
            //... Generate random color and size circle at mouse click point.
            Color randColor = new Color((int)(256*Math.random()),
                                        (int)(256*Math.random()),
                                        (int)(256*Math.random()));
            int randRadius = (int) (_size/4 * Math.random());
            Circle c = new Circle(e.getPoint(), randRadius, randColor);

            //... Save this circle for painting later.
            _circles.add(c);

            //... Cause screen to be repainted.
            repaint();
        }
    }

## A class for representing a circle

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
    // File   : Circle.java - Stores and draws a circle.
    // Purpose: Shows a simple class that saves and draws a circle.
    // Author : Fred Swartz - 2006-11-30 - Placed in public domain.

    import java.awt.*;

    ///////////////////////////////////////////////////////////////// Circle
    class Circle {
        //=========================================================== fields
        int   _x;           // x coord of bounding rect upper left corner.
        int   _y;           // y coord of bounding rect upper left corner.
        int   _diameter;    // Height and width of bounding rectangle.
        Color _color;

        //====================================================== constructor
        Circle(Point center, int radius, Color color) {
            //... Change user oriented parameters into more useful values.
            _x        = center.x - radius;
            _y        = center.y - radius;
            _diameter = 2 * radius;
            _color    = color;
        }

        //============================================================= draw
        void draw(Graphics g) {
            //... Should we save and restore the previous color?
            g.setColor(_color);
            g.fillOval(_x, _y, _diameter, _diameter);
        }
    }