rollenholt的博文:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html

弹球例子:

0. 创建Bounce框架 JFrame frame = new BounceFrame();
    BounceFrame自定义了addButton、addBall方法,用于在frame内的panel添加按钮、小球

1. 设置标题 setTitle("bounce");
2. 创建BallComponent comp = new Ballcomponent();
  BallComponent继承于JPanel。专门用于容纳并绘制Ball
3. 将comp添加到框架frame

4. 创建JPanel buttonPanel = new JPanel();用于存放start、close按钮
5. 创建start、close按钮,并添加到buttonPanel中
6. 将buttonPanel添加到框架frame

代码:

Bounce.java 

public class Bounce {
public static void main(String args[]){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new BounceFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
} class BallRunnable implements Runnable{
private Ball ball;
private Component component;
public static final int STEPS =2000;
public static final int DELAY = 5 ; public BallRunnable(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()); //移动小球
//repaint会激活component的paintComponent方法
component.repaint();
Thread.sleep(DELAY);
}
}catch(InterruptedException e){
//处理异常
}
}
} class BounceFrame extends JFrame{
private BallComponent comp; public BounceFrame(){
setTitle("Bounce");
comp = new BallComponent();
add(comp,BorderLayout.CENTER);
JPanel buttonPanel = new JPanel();
addButton(buttonPanel,"Start",new ActionListener(){
public void actionPerformed(ActionEvent e){
addBall();
}
}); addButton(buttonPanel , "Close" , new ActionListener(){
public void actionPerformed(ActionEvent e){
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);
Runnable r = new BallRunnable(ball,comp);
Thread t = new Thread(r);
t.start(); }catch(Exception e){
//处理异常
}
} }

  

Ball.java

package com.thread.Multithreadball;

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

BallComponent.java

public class BallComponent extends JPanel{
private static final int DEFAULT_WIDTH = 450;
private static final int DEFAULT_HEIGHT = 350; private List<Ball> balls = new ArrayList<>(); //将一个球加入到component
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);
}
}

  

Java学习笔记--多线程的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  3. java学习笔记 --- 多线程(多线程的创建方式)

    1.创建多线程方式1——继承Thread类. 步骤:  A:自定义类MyThread继承Thread类.  B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...

  4. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  5. 0039 Java学习笔记-多线程-线程控制、线程组

    join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...

  6. JAVA学习笔记 -- 多线程之共享资源

    在多线程程序执行过程中,可能会涉及到两个或者多个线程试图同一时候訪问同一个资源.为了防止这样的情况的发生,必须在线程使用共享资源时给资源"上锁",以阻挡其他线程的訪问. 而这样的机 ...

  7. 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal

    什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...

  8. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  9. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

随机推荐

  1. C语言里面关于数组的一个容易忽视的小细节

    ginobili@VM_44_28_sles10sp1:~/code> cat test3.cpp #include <stdio.h> int main(){ char a[5] ...

  2. hadoop集群的故障概率估算

    hadoop集群的机器数业界(国内)最大的在5000左右,是什么限制了集群的规模呢?有好几个原因. 1. namenode的内存大小限制 2. 机器故障概率随着机器数目增大而增大,通常一份数据存储在h ...

  3. Lazy Load Plugin for jQuery延迟加载测试成功

    一直需要的功能,网页图片太多时对于降低网络流量超有用. 最新的V1.9.3版本其实已不用修改就可以起作用了. 不用网上说的要自己修改代码.

  4. PYTHON线程知识再研习E---条件变量同步Condition

    Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的 acquire和release方法外,还提供了wait和notify ...

  5. BZOJ2021: [Usaco2010 Jan]Cheese Towers

    2021: [Usaco2010 Jan]Cheese Towers Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 184  Solved: 107[Su ...

  6. Android AutoCompleteTextView和MultiAutoCompleteTextView使用

    Android AutoCompleteTextView和MultiAutoCompleteTextView的功能类似于百度或者Google在搜索栏输入信息的时候,弹出的与输入信息接近的提示信息: 它 ...

  7. 利用ThinkPHP搭建网站后台架构

    记录一下ThinkPHP搭建网站后台.调整好样式等操作步骤 下载好ThinkPHP(3.2.3),解压后将核心文件夹ThinkPHP以及index.php等文件复制到网站根目录如下图 对index.p ...

  8. poj3254:基础状压dp

    第二个状压dp 做过的第一个也是放牛问题,两头牛不能相邻 这个题多了一个限制,就是有些位置不能放牛 于是先与处理一下每一行所有不能放牛的状态,处理的过程直接对每一个不能放牛的状态或以下 ac代码: # ...

  9. Highcharts 点击反选

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. Qt5官方demo解析集21——Extending QML - Adding Types Example

    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 又是一个新的系列了,只是这个系列和我们之前的Chapt ...