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