日期:2014-05-20 浏览次数:20743 次
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(); } } } }
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()); } } }
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); } }