package com.bornander.circles;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
public class Program extends JFrame {
private static Random rnd = new Random();
private static class Circle {
public float x;
public float y;
public float r;
public Circle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
}
private Color[] colors = new Color[] {
Color.RED,
Color.BLUE,
Color.BLACK,
Color.WHITE,
Color.MAGENTA,
Color.WHITE
};
private ArrayList<Circle> circles = new ArrayList<Circle>();
public Program() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setVisible(true);
circles.add(new Circle(400, 300, 200));
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent arg0) {
addCircle();
}
@Override
public void mouseEntered(MouseEvent arg0) { }
@Override
public void mouseExited(MouseEvent arg0) { }
@Override
public void mousePressed(MouseEvent arg0) { }
@Override
public void mouseReleased(MouseEvent arg0) { }
});
}
private void addCircle() {
Circle last = circles.get(circles.size() - 1);
float newRadius = 0.8f * last.r; // Next circle is 80% of last
float delta = last.r - newRadius;
float x = (rnd.nextFloat() * delta) * (rnd.nextBoolean() ? 1.0f : -1.0f);
float maxY = (float)Math.sqrt(delta*delta - x*x);
float y = rnd.nextFloat() * maxY * (rnd.nextBoolean() ? 1.0f : -1.0f);
circles.add(new Circle(last.x+x, last.y+y, newRadius));
repaint();
}
@Override
public void paint(Graphics graphics) {
Graphics2D g = (Graphics2D)graphics;
g.setColor(Color.GREEN);
g.fillRect(0, 0, getWidth(), getHeight());
int index = 0;
for(Circle circle : circles) {
g.setColor(colors[(index++) % colors.length]);
int x = (int)(circle.x - circle.r);
int y = (int)(circle.y - circle.r);
int d = (int)(2 * circle.r);
g.fillOval(x, y, d, d);
}
}
public static void main(String[] args) {
Program program = new Program();
}
}
Top comments (1)
I'm not 100% familiar with Java; but my C# experience is telling me immediately that the Circle class being static won't allow you to new them up for you to put into your ArrayList.
AFAIK, static is a singleton that is generated once at runtime and can't be instanced. (Which is what you are trying to do.)