package org.chapter.thread;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
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 java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoundThreadTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new BounceFrame();
}
});
}
}
class BounceFrame extends JFrame{
private Ballcomponent comp;
public static final int STEPS=1000;
public static final int DELAY=3;
public BounceFrame() {
//得到屏幕的方位
Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds((dim.width-500)/2, (dim.height-500)/2, 500, 500);
this.setVisible(true);
//设置 默认退出时候的状态
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("BounceThread");
comp= new Ballcomponent();
this.add(comp,BorderLayout.CENTER);
JPanel buttonPanel=new JPanel();
addButton(buttonPanel, "start", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
addBall();
}
});
addButton(buttonPanel, "close", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
this.add(buttonPanel,BorderLayout.SOUTH);
}
public void addButton(Container c,String tittle ,ActionListener listener){
JButton button=new JButton(tittle);
c.add(button);
button.addActionListener(listener);
}
//线程开起
public void addBall(){
Ball b=new Ball();
comp.add(b);
Runnable r=new BoundRunnable(b, comp);
Thread t=new Thread(r);
t.start();
}
}
class Ballcomponent extends JPanel{
private List<Ball> balls=new ArrayList<Ball>();
public void add(Ball b){
balls.add(b);
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
for (Ball b : balls) {
g2.fill(b.getShape());
}
}
}
//跳球将放在线程中 实现runnable接口
class BoundRunnable implements Runnable {
private Ball ball;
private Component component;
public static final int STEPS=1000;
public static final int DELAY=5;
public BoundRunnable(Ball ball,Component component) {
this.ball=ball;
this.component=component;
}
//线程的运行 将跳球的方法放在线程中运行
public void run() {
try {
for (int i = 0; i <=STEPS; i++) {
ball.move(component.getBounds());
component.repaint();
Thread.sleep(DELAY);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
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();
dx=-dx;
}
if(x+XSIZE>=bounds.getMaxX()){
x=bounds.getMaxX()-XSIZE;
dx=-dx;
}
if(y<bounds.getMinY()){
y=bounds.getMaxY()-YSIZE;
dy=-dy;
}
}
public Ellipse2D getShape(){
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
}
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
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 java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoundThreadTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new BounceFrame();
}
});
}
}
class BounceFrame extends JFrame{
private Ballcomponent comp;
public static final int STEPS=1000;
public static final int DELAY=3;
public BounceFrame() {
//得到屏幕的方位
Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds((dim.width-500)/2, (dim.height-500)/2, 500, 500);
this.setVisible(true);
//设置 默认退出时候的状态
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("BounceThread");
comp= new Ballcomponent();
this.add(comp,BorderLayout.CENTER);
JPanel buttonPanel=new JPanel();
addButton(buttonPanel, "start", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
addBall();
}
});
addButton(buttonPanel, "close", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
this.add(buttonPanel,BorderLayout.SOUTH);
}
public void addButton(Container c,String tittle ,ActionListener listener){
JButton button=new JButton(tittle);
c.add(button);
button.addActionListener(listener);
}
//线程开起
public void addBall(){
Ball b=new Ball();
comp.add(b);
Runnable r=new BoundRunnable(b, comp);
Thread t=new Thread(r);
t.start();
}
}
class Ballcomponent extends JPanel{
private List<Ball> balls=new ArrayList<Ball>();
public void add(Ball b){
balls.add(b);
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
for (Ball b : balls) {
g2.fill(b.getShape());
}
}
}
//跳球将放在线程中 实现runnable接口
class BoundRunnable implements Runnable {
private Ball ball;
private Component component;
public static final int STEPS=1000;
public static final int DELAY=5;
public BoundRunnable(Ball ball,Component component) {
this.ball=ball;
this.component=component;
}
//线程的运行 将跳球的方法放在线程中运行
public void run() {
try {
for (int i = 0; i <=STEPS; i++) {
ball.move(component.getBounds());
component.repaint();
Thread.sleep(DELAY);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
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();
dx=-dx;
}
if(x+XSIZE>=bounds.getMaxX()){
x=bounds.getMaxX()-XSIZE;
dx=-dx;
}
if(y<bounds.getMinY()){
y=bounds.getMaxY()-YSIZE;
dy=-dy;
}
}
public Ellipse2D getShape(){
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
}