日期:2014-05-20  浏览次数:20682 次

coreJava上一个多线程的例子
由于我没有学过swing所以书上的例子我不知道错在哪里~
我运行的结果是只弹出一个窗体 里面什么都没有
而书上说的效果图是有一个start的按钮和一个close按钮以及一个会动的小球
下面给出代码求大神帮忙看看
Java code
package com.coreJava.multithreading;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Bounce {

    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                JFrame frame=new BounceFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
    
}

class BounceFrame extends JFrame{
    
    /**
     * 
     */
    private static final long serialVersionUID = 8985838171214084208L;
    private BallComponent comp;
    private static final int DEFAULT_WIDTH=450;
    private static final int DEFAULT_HEIGHT=350;
    private static final int STEPS=1000;
    private static final int DELAY=3;
    
    public BounceFrame(){
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        setTitle("Bounce");
        
        comp=new BallComponent();
        add(comp,BorderLayout.CENTER);
        JPanel buttonPanel=new JPanel();
        addButton(buttonPanel, "Start", new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                addBall();
            }
        });
        
        addButton(buttonPanel, "Close", new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        
    }
    
    public void addButton(Container c,String title,ActionListener listener){
        JButton button=new JButton(title);
        c.add(button);
        button.addActionListener(listener);
    }
    
    public void addBall(){
        Ball ball=new Ball();
        comp.add(ball);
        for (int i = 1; i <=STEPS; i++) {
            ball.move(comp.getBounds());
            comp.paint(comp.getGraphics());
            try {
                Thread.sleep(DELAY);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
}


Java code
package com.coreJava.multithreading;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class BallComponent extends JPanel{

    private ArrayList<Ball> balls=new ArrayList<Ball>();
    
    public void add(Ball b){
        balls.add(b);
    }
    
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
        for (Ball b : balls) {
            g2.fill(b.getShape());
        }
    }
    
}


Java code
package com.coreJava.multithreading;

import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

public 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 void move(Rectangle2D bounds){
        x+=dx;
        y+=dy;
        if(x<bounds.getMinX()){
            x=bounds.getMaxX();
            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;
        }
    }
    
    public Ellipse2D getShape(){
        return new Ellipse2D.Double(x,y,XSIZE,YSIZE);
    }
    
}