读书人

coreJava上一个多线程的例子,该怎么处

发布时间: 2012-05-01 12:48:58 作者: rapoo

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);    }    } 






[解决办法]
Java code
package ClassSerializable;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.util.ArrayList;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;    static final int STEPS = 1000;    static final int DELAY = 3;    public BounceFrame() {        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);        setTitle("Bounce");        comp = new BallComponent();        comp.setBounds(0,0,400,300);//1.setBounds        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);            }        });        this.getContentPane().add(comp,BorderLayout.CENTER);        this.getContentPane().add(buttonPanel);//把buttonPanel加上        this.setVisible(true);    }    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();            }        }    }}class BallComponent extends JPanel{    /**     *      */    private static final long serialVersionUID = 345516271963530470L;    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;        Color c = g2.getColor();        g2.setColor(Color.black);        for (Ball b : balls) {            g2.fill(b.getShape());        }        g2.setColor(c);    }}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.getMinX() + XSIZE;            dx = -dx;        }        if (x + XSIZE >= bounds.getMaxX()) {            x = bounds.getMaxX() - XSIZE;            dx = -dx;        }        if (y < bounds.getMinY()) {            y = bounds.getMinY() + YSIZE;            dy = -dy;        }        if (y + YSIZE >= bounds.getMaxY()) {            y = bounds.getMaxY() - YSIZE;            dy = -dy;        }    }    public Ellipse2D getShape() {        return new Ellipse2D.Double(x, y, XSIZE, YSIZE);    }} 

读书人网 >J2SE开发

热点推荐