14 线程
package thread; import java.awt.BorderLayout; import java.awt.Container; import java.awt.EventQueue; 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(() ->{ JFrame jFrame = new BounceFrame(); jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE); jFrame.setVisible(true); }); } } class BounceFrame extends JFrame{ /** * */ private static final long serialVersionUID = 1L; private BallComponent comp; public static final int STEPS = 1000; public static final int DELAY = 3; public BounceFrame(){ setTitle("Bonus"); comp = new BallComponent(); this.getContentPane().add(comp, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); // this.addButton(buttonPanel, "start", event -> addBall());//单线程 this.addButton(buttonPanel, "start", event -> addBallT());//创建多个线程,添加多个ball this.addButton(buttonPanel, "close", event -> System.exit(0)); add(buttonPanel,BorderLayout.SOUTH); pack(); } public void addButton(Container c,String title,ActionListener listener){ JButton button = new JButton(title); c.add(button); button.addActionListener(listener); } public void addBall(){ try { Ball ball = new Ball(); comp.add(ball); for (int i = 0; i < STEPS; i++) { System.out.println("i--->"+i); ball.move(comp.getBounds()); comp.paint(comp.getGraphics()); Thread.sleep(DELAY); } } catch (Exception e) { e.printStackTrace(); } } public void addBallT(){ Ball ball = new Ball(); comp.add(ball); //开启多线程 Runnable r = () ->{ try { for (int i = 0; i < STEPS; i++) { ball.move(comp.getBounds()); comp.repaint(); Thread.sleep(DELAY); } } catch (Exception e) { e.printStackTrace(); } }; Thread thread = new Thread(r); thread.start(); } }
package thread; 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 static void main(String[] args) { } public void move(Rectangle2D bounds){ x += dx; y += dy; if(x < bounds.getMinX()){ x = bounds.getMinX(); 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); } }
package thread; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; import javax.swing.JPanel; public class BallComponent extends JPanel { /** * */ private static final long serialVersionUID = 1L; private static final int DEFAULT_WIDTH = 450; private static final int DEFAULT_HEIGHT = 350; private java.util.List<Ball> balls = new ArrayList<>(); 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()); } } public Dimension getPreferredSize(){ return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } public static void main(String[] args) { } }