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