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) {

    }
    
    

}

 

posted @ 2018-02-12 10:04  aLa神灯  阅读(97)  评论(0编辑  收藏  举报