みなさん、私が設定した ArrayList に新しいボールを追加するボタンがあります。新しいボールを追加する代わりに、すでに行っているボールの速度を上げるだけです。この CreateCircle はボールを作成します。
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class CreateCircle extends JPanel {
/* Ports JFrame width, height from BouncingDrawFrame */
static double c, d;
/* Ports desired size of Circle */
static int r = 20; // Initial Value 20
/* Ports timer delay from BouncingDrawFrame */
static int z = 10; // Initial Value 10
/* Timer to control speed */
static Timer t = new Timer(z, null);
/* X,Y points to start, speed of movement */
static double x, y, velX = 1, velY = 1;
/* Ports color choice from BouncingDrawFrame */
static Color myColor;
public CreateCircle(int a, int b) {
/* Height of Frame */
c = a;
/* Width of Frame */
d = b;
t.start();
t.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
/* "Bounces" the Ball off the sides */
if (x < 0 || x > (d - (r + 2))) {
velX = -velX;
}
/* "Bounces" the Ball off the top and bottom */
if (y < 0 || y > (c - (r + 30))) {
velY = -velY;
}
/* Moves ball 2 pixels each timer action */
x += velX;
y += velY;
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Ellipse2D circle = new Ellipse2D.Double(x, y, r, r);
g2.setColor(myColor);
g2.fill(circle);
}
}
これはボタンを処理するクラスですが、クリックすると新しいボールが作成されます。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class BouncingDrawFrame extends JFrame {
public BouncingDrawFrame() {
/*
* Create ArrayList to hold balls, remember ArrayList is not a component
* but the elements of ArrayList are
*/
final ArrayList<CreateCircle> ballList = (ArrayList<CreateCircle>) new ArrayList<CreateCircle>();
/* Create Main Ball Frame */
final JFrame main = new JFrame();
main.setTitle("Bouncing Balls!!");
main.setSize(350, 500);
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setLocationRelativeTo(null);
main.setVisible(true);
/* Create Control Panel */
JFrame control = new JFrame();
control.setSize(300, 300);
control.setTitle("Change Settings!");
control.setLocationRelativeTo(null);
control.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
control.setVisible(true);
final JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(10, 2));
control.add(p1);
final JButton addBall = new JButton("Add A Ball");
p1.add(addBall);
/* Y Point */
final int a = main.getHeight();
/* X Point */
final int b = main.getWidth();
ballList.add(new CreateCircle(a, b));
main.add(ballList.get(0));
addBall.addActionListener(new ActionListener() {
private int click;
public void actionPerformed(ActionEvent arg0) {
click++;
ballList.add((click), new CreateCircle(a, b));
System.out.println(click);
System.out.println(ballList.size());
main.add(ballList.get(click));
repaint();
}
});
}
}
新しいボールを作成する代わりに、ボタンをクリックすると、最初のボールの動きが速くなります。クリックされた量に等しい ArrayList のインデックスに新しいボールを追加しようとしています。ArrayList のサイズとクリック数をシステムに出力しているので、ArrayList のサイズがクリック回数に応じて増加していることがわかります。新しい CreateCircle を追加しない理由がわかりません。
PS: これがメイン スレッドです。
public class BouncingRun {
public static void main(String[] args) {
new BouncingDrawFrame();
}
}