本帖最后由 beyondmk2001 于 2011-06-30 19:25:31 编辑

解决方案 »

  1.   

    因为你的每个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);
                }
            });
        }}
      

  2.   

    轨迹就是你的move方法,每次x坐标前进dx,y坐标前进dy,当轨迹超出界限时,把x,y调整,然后dx,dy乘以-1,相当于改变方向前进