因为你的每个ball的轨迹是相同的,所以你看不出结果 /** * 程序中为什么只有1个Ball,为什么左上角会出现一个按钮? * 为什么不是一个一个的球在运动,而是1个球在划轨迹?为什么是这样的轨迹? * 程序中声明了2个静态final变量STEPS和DELAY,难道没有冲突吗? */ import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.util.*; import javax.swing.*; class Ball{ private static final int XSIZE=15; private static final int YSIZE=15; private double x=0; private double y=0; private double dx=1; private double dy=1; public Ellipse2D getShape(){ return new Ellipse2D.Double(x, y, XSIZE, YSIZE); } public Ball(double x, double y) { //加一个构造方法,改一下轨迹的起点 this.x = x; this.y = y; } public void move(Rectangle bounds){//move方法不理解 x+=dx; y+=dy; if(x<bounds.getMinX()){ x=bounds.getX(); dx=-dx; } if(x+XSIZE>=bounds.getMaxX()){ x=bounds.getMaxX()-XSIZE; dx=-dx; } if(y<bounds.getMinY()){ y=bounds.getMinY(); dy=-dy; } if(y+YSIZE>=bounds.getMaxY()){ y=bounds.getMaxY()-YSIZE; dy=-dy; } } } @SuppressWarnings(value={"serial"}) class BallComponent extends JPanel{ private ArrayList<Ball> balls=new ArrayList<Ball>(); public void addBall(Ball b){ balls.add(b); } public void paintComponent(Graphics g){ super.paintComponents(g); Graphics2D g2=(Graphics2D)g; for(Ball b:balls){ g2.fill(b.getShape()); } }
} @SuppressWarnings(value={"serial"}) class BounceFrame extends JFrame{ private BallComponent comp; public static final int DEFAULT_WIDTH=450; public static final int DEFAULT_HEIGHT=350; public static final int STEPS=1000; public static final int DELAY=3; public void addButton(Container c,String title,ActionListener listener){ JButton button=new JButton(title); c.add(button); button.addActionListener(listener); } public BounceFrame(){ setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); setTitle("BounceTread"); setLocation(458,209); comp=new BallComponent(); add(comp,BorderLayout.CENTER); JPanel buttonPanel=new JPanel(); addButton(buttonPanel,"Start",new ActionListener(){ public void actionPerformed(ActionEvent event){ addBall(); } }); addButton(buttonPanel,"Close",new ActionListener(){ public void actionPerformed(ActionEvent event){ System.exit(0); } }); add(buttonPanel,BorderLayout.SOUTH); } public void addBall(){ Ball b=new Ball((double)Math.random()*50, (double)Math.random()*80); //改一下 comp.addBall(b); Runnable r=new BallRunnable(b,comp); Thread t=new Thread(r); t.start(); } } class BallRunnable implements Runnable{ private Ball ball; private Component component; public static final int STEPS=1000; public static final int DELAY=5; public BallRunnable(Ball aBall,Component aComponent){ ball=aBall; component=aComponent; } public void run(){ try{ for(int i=1;i<=STEPS;i++){ ball.move(component.getBounds()); component.repaint(); Thread.sleep(DELAY); } }catch(InterruptedException e){
} } } public class BounceThread { public static void main(String[] args){ EventQueue.invokeLater(new Runnable(){ public void run(){ JFrame frame=new BounceFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); }}
/**
* 程序中为什么只有1个Ball,为什么左上角会出现一个按钮?
* 为什么不是一个一个的球在运动,而是1个球在划轨迹?为什么是这样的轨迹?
* 程序中声明了2个静态final变量STEPS和DELAY,难道没有冲突吗?
*/
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
class Ball{
private static final int XSIZE=15;
private static final int YSIZE=15;
private double x=0;
private double y=0;
private double dx=1;
private double dy=1;
public Ellipse2D getShape(){
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
public Ball(double x, double y) { //加一个构造方法,改一下轨迹的起点
this.x = x;
this.y = y;
}
public void move(Rectangle bounds){//move方法不理解
x+=dx;
y+=dy;
if(x<bounds.getMinX()){
x=bounds.getX();
dx=-dx;
}
if(x+XSIZE>=bounds.getMaxX()){
x=bounds.getMaxX()-XSIZE;
dx=-dx;
}
if(y<bounds.getMinY()){
y=bounds.getMinY();
dy=-dy;
}
if(y+YSIZE>=bounds.getMaxY()){
y=bounds.getMaxY()-YSIZE;
dy=-dy;
}
}
}
@SuppressWarnings(value={"serial"})
class BallComponent extends JPanel{
private ArrayList<Ball> balls=new ArrayList<Ball>();
public void addBall(Ball b){
balls.add(b);
}
public void paintComponent(Graphics g){
super.paintComponents(g);
Graphics2D g2=(Graphics2D)g;
for(Ball b:balls){
g2.fill(b.getShape());
}
}
}
@SuppressWarnings(value={"serial"})
class BounceFrame extends JFrame{
private BallComponent comp;
public static final int DEFAULT_WIDTH=450;
public static final int DEFAULT_HEIGHT=350;
public static final int STEPS=1000;
public static final int DELAY=3;
public void addButton(Container c,String title,ActionListener listener){
JButton button=new JButton(title);
c.add(button);
button.addActionListener(listener);
}
public BounceFrame(){
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
setTitle("BounceTread");
setLocation(458,209);
comp=new BallComponent();
add(comp,BorderLayout.CENTER);
JPanel buttonPanel=new JPanel();
addButton(buttonPanel,"Start",new ActionListener(){
public void actionPerformed(ActionEvent event){
addBall();
}
});
addButton(buttonPanel,"Close",new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});
add(buttonPanel,BorderLayout.SOUTH);
}
public void addBall(){
Ball b=new Ball((double)Math.random()*50, (double)Math.random()*80); //改一下
comp.addBall(b);
Runnable r=new BallRunnable(b,comp);
Thread t=new Thread(r);
t.start();
}
}
class BallRunnable implements Runnable{
private Ball ball;
private Component component;
public static final int STEPS=1000;
public static final int DELAY=5;
public BallRunnable(Ball aBall,Component aComponent){
ball=aBall;
component=aComponent;
}
public void run(){
try{
for(int i=1;i<=STEPS;i++){
ball.move(component.getBounds());
component.repaint();
Thread.sleep(DELAY);
}
}catch(InterruptedException e){
}
}
}
public class BounceThread {
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame=new BounceFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}}