Drawing multiple circles with Java2D

13,812

The way to do this is to remove the drawing methods from the circle class and create a single panel with multiple circles on it instead:

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

public class Circles extends JPanel
{
    ArrayList<Circle> circles = new ArrayList<Circle>();

    public void add(Circle circle) {
        circles.add(circle);
    }

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

        for (Circle circle: circles) {
            Ellipse2D circle2D = new Ellipse2D.Double();
            circle2D.setFrameFromCenter(
                circle.getCenterX(),
                circle.getCenterY(),
                circle.getCenterX() + circle.getRadius(),
                circle.getCenterY() + circle.getRadius());
            g2.draw(circle2D);
        }
    }
}
Share:
13,812
Admin
Author by

Admin

Updated on June 15, 2022

Comments

  • Admin
    Admin almost 2 years

    I am trying to use Java2D to do some simple graphics programming. I've started easy, just trying to display a couple of circles in a JFrame. I was successful displaying a single circle, but when adding a second circle, only the last circle added to the JFrame is displayed. I use class Circle to define my circle and to override the paintComponent method used to display it. Any suggestions on what I might be doing wrong would be greatly appreciated. Code for my classes Circle and DancingCircles is provided below for reference.

    import java.awt.*;
    import javax.swing.*;
    import java.awt.geom.*;
    /**
     *
     * @author Paul
     */
    public class Circle extends JPanel {
    
    // Data members for Circle center and radius
    private double centerX, centerY;
    private double radius;
    
    // No-argument constructor
    Circle() {
        centerX = 200;
        centerY = 200;
        radius = 10;
    }
    
    // Full-argument constructor
    Circle( double x, double y, double r) {
        centerX = x;
        centerY = y;
        radius = r;
    }
    
    // Draw a Circle
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    
        //Convert to Java2D Object
        Graphics2D g2 = (Graphics2D) g;
    
        // Create the circle
        Ellipse2D circle = new Ellipse2D.Double();
        circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
    
        // Draw it
        g2.draw(circle);
    }// end paintComponent
    
    // Get/set data members
    public void setCenterX(double x){this.centerX = x;}
    public void setCenterY(double y){this.centerY = y;}
    public void setRadius(double r){radius = r;}
    
    public double getCenterX(){return centerX;}
    public double getCenterY(){return centerY;}
    public double getRadius(){return radius;}
    }// end class Circle
    
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     *
     * @author Paul
     */
    public class DancingCircles extends JFrame{
    
    // Display Dimensions
    public static final int DEFAULT_WIDTH = 400;
    public static final int DEFAULT_HEIGHT = 400;
    
    // Default constructor
    private DancingCircles() {
        setTitle("Dancing Circles");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    
        // Add Circles to JFrame
        Circle myCircle = new Circle(200.0, 200.0, 20.0);
        add(myCircle);          // Add circle to frame
        Circle myCircle2 = new Circle(100.0, 100.0, 30.0);
        add(myCircle2);        // Add circle to frame
    }// end DancingCircles
    
    public static void main(String[] args) {
    
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                DancingCircles dc = new DancingCircles();
                dc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                dc.setVisible(true);
            }
        });
    
     }// end main
    }
    

    Thanks!

    Paul