典型多线程小实例:球的运动

原创 2005年05月31日 23:14:00

/**
*一个典型的多线程小实例:球的运动
*几乎每一处都有注释,只要一点时间就能看懂
*适合初学者学习交流
*这是我学习java线程时做的一个小程序,请大家指教
*电子邮箱tomtailer@163.com
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ball
{
public static void main(String args[])
{
new frame();
}
}
class frame extends JFrame implements ActionListener,ChangeListener
{
JPanel jp_HuaBan;
JPanel jp_YuLan;
JSlider js_red;
JSlider js_green;
JSlider js_blue;
JSlider js_size;
int x=45,y=45;
int ball_size=30;

public frame()
{
super("ball");

//创建画板
jp_HuaBan=new JPanel();
jp_HuaBan.setBounds(20,0,450,200);
jp_HuaBan.setBackground(Color.white);

//创建球的予览框
jp_YuLan=new JPanel();
jp_YuLan.setBounds(350,220,120,120);
jp_YuLan.setBackground(Color.white);

//创建一个文本框作为状态栏
JTextField jt_status=new JTextField("请选择球的颜色、大小然后点击按钮");
jt_status.setBounds(1,404,492,20);
jt_status.setEditable(false);

//创建红、绿、蓝三个标签
JLabel jl_red=new JLabel("红");
jl_red.setBounds(20,215,30,20);
JLabel jl_green=new JLabel("绿");
jl_green.setBounds(20,260,30,20);
JLabel jl_blue=new JLabel("蓝");
jl_blue.setBounds(20,305,30,20);
JLabel jl_size=new JLabel("大小");
jl_size.setBounds(20,350,30,20);

//创建红、绿、蓝三个滑块
js_red=new JSlider(SwingConstants.HORIZONTAL,0,255,127);
js_red.setBounds(50,210,250,45);
//填充滑块
js_red.putClientProperty("JSlider.isFilled",Boolean.TRUE);
//绘制勾号标记
js_red.setPaintTicks(true);
//主要的勾号标记大小
js_red.setMajorTickSpacing(50);
//次要的勾号标记大小
js_red.setMinorTickSpacing(25);
//显示主要刻度的数字标记
js_red.setPaintLabels(true);
//添加监听者
js_red.addChangeListener(this);

js_green=new JSlider(SwingConstants.HORIZONTAL,0,255,127);
js_green.setBounds(50,255,250,45);
js_green.putClientProperty("JSlider.isFilled",Boolean.TRUE);
js_green.setPaintTicks(true);
js_green.setMajorTickSpacing(50);
js_green.setMinorTickSpacing(25);
js_green.setPaintLabels(true);
js_green.addChangeListener(this);
js_blue=new JSlider(SwingConstants.HORIZONTAL,0,255,127);
js_blue.setBounds(50,300,250,45);
js_blue.putClientProperty("JSlider.isFilled",Boolean.TRUE);
js_blue.setPaintTicks(true);
js_blue.setMajorTickSpacing(50);
js_blue.setMinorTickSpacing(25);
js_blue.setPaintLabels(true);
js_blue.addChangeListener(this);
//创建球的大小的滑块
js_size=new JSlider(SwingConstants.HORIZONTAL,10,50,30);
js_size.setBounds(50,345,250,45);
js_size.putClientProperty("JSlider.isFilled",Boolean.TRUE);
js_size.setPaintTicks(true);
js_size.setMajorTickSpacing(10);
js_size.setMinorTickSpacing(5);
js_size.setPaintLabels(true);
js_size.addChangeListener(this);

//创建按钮
JButton jb=new JButton("ball");
jb.setBounds(350,360,120,30);
jb.addActionListener(this);

//将所有对象添加到窗体
Container c=this.getContentPane();
c.setLayout(null);
c.add(jp_HuaBan);
c.add(jp_YuLan);
c.add(jl_red);
c.add(jl_green);
c.add(jl_blue);
c.add(jl_size);
c.add(js_red);
c.add(js_green);
c.add(js_blue);
c.add(js_size);
c.add(jb);
c.add(jt_status);
//设置窗体的位置和大小
this.setBounds(100,50,500,450);
this.setResizable(false);
this.setVisible(true);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}

public void actionPerformed(ActionEvent e)
{
Color ball_color=new Color(js_red.getValue(),
js_green.getValue(),js_blue.getValue());
rball r=new rball(jp_HuaBan,js_size.getValue(),ball_color);
r.start();
lball l=new lball(jp_HuaBan,js_size.getValue(),ball_color);
l.start();
}

public void stateChanged(ChangeEvent e)
{
//获得jp_YuLan的画笔并在jp_YuLan的中心画个圆
Graphics g=jp_YuLan.getGraphics();
g.setColor(Color.white);
g.fillOval(x,y,ball_size,ball_size);
x=60-js_size.getValue()/2;
y=60-js_size.getValue()/2;
ball_size=js_size.getValue();
g.setColor(new Color(js_red.getValue(),
js_green.getValue(),js_blue.getValue()));
g.fillOval(x,y,ball_size,ball_size);
g.dispose();
}
}

class lball extends Thread
{
//从窗口左面出现的球
JPanel jp_HuaBan;
int ball_size;
Color ball_color;

public lball(JPanel j,int i,Color c)
{
//获得画板的句柄
jp_HuaBan=j;
//获得球的大小
ball_size=i;
//获得球的颜色
ball_color=c;
}

public void run()
{
Graphics g=jp_HuaBan.getGraphics();
int x=0,y=0;
//计算画球时X轴,Y轴的最大坐标
int HuaBan_x=450-ball_size;
int HuaBan_y=200-ball_size;
//球移动的增量
int x_increase=5,y_increase=5;
while(true)
{
//将上一次画的球擦掉
g.setColor(Color.white);
g.fillOval(x,y,ball_size,ball_size);
//画球
g.setColor(ball_color);
x=x+x_increase;
y=y+y_increase;
g.fillOval(x,y,ball_size,ball_size);
//判断球是否到达了边界,若到达了则转向
if(x<=0 || x>=HuaBan_x) x_increase=-x_increase;
if(y<=0 || y>=HuaBan_y) y_increase=-y_increase;
try
{
//休眠一段时间
Thread.sleep(60);
}
catch(Exception e){}
}
}
}

class rball extends Thread
{
//从窗口左面出现的球
JPanel jp_HuaBan;
int ball_size;
Color ball_color;

public rball(JPanel j,int i,Color c)
{
jp_HuaBan=j;
ball_size=i;
ball_color=c;
}

public void run()
{
Graphics g=jp_HuaBan.getGraphics();
int x=450-ball_size,y=0;
int HuaBan_x=x;
int HuaBan_y=200-ball_size;
int x_increase=-5,y_increase=5;
while(true)
{

g.setColor(Color.white);
g.fillOval(x,y,ball_size,ball_size);
g.setColor(ball_color);
x=x+x_increase;
y=y+y_increase;
g.fillOval(x,y,ball_size,ball_size);
if(x<=0 || x>=HuaBan_x) x_increase=-x_increase;
if(y<=0 || y>=HuaBan_y) y_increase=-y_increase;
try
{
Thread.sleep(30);
}
catch(Exception e){}
}
}
}

多线程典型问题实现总结

多线程编程中,我们会经常碰到一个线程push信息,另外一个线程按照先进先出原则处理的情况.比如多线程资源加载,网络通信等.本文总结了此种情况下的各种解决方案,并给出一个无须加锁的解.一.常用做法   ...
  • ybt631
  • ybt631
  • 2011年07月19日 18:10
  • 1399

java多线程典型例子及分析

java多线程典型例子及分析线程的一些常用简单的知识点 join() Thread提供了让一个线程等待另一个线程完成的方法–join()方法:比如在线程B中调用了线程A的Join()方法,直到线程A执...
  • wgyscsf
  • wgyscsf
  • 2016年03月12日 23:08
  • 416

两种方式实现多线程共享资源(典型的售票例子)

1、继承Thread TestThread类 public class TestThread extends Thread{ private int ticket = 300; @Overr...

C#多线程实例

  • 2015年01月14日 10:17
  • 73KB
  • 下载

java 多线程实例

  • 2015年10月30日 17:10
  • 3KB
  • 下载

Qt多线程:QtConcurrent配合lambda表达式(实例)

Qt多线程:QtConcurrent配合lambda表达式(实例)

多线程任务控制实例代码

  • 2014年01月22日 09:30
  • 899B
  • 下载

多线程实例

  • 2013年12月09日 11:45
  • 362B
  • 下载

多线程套接字编程-----程序实例(C++实现)

一.程序介绍 该程序主要包括以下内容: 1.多线程程序设计的一般框架,新线程负责循环接收网络数据,一旦收到网络数据就交由主线程处理;主线程负责循环处理网络数据。 2.(UDP)套接字编程的一般框...
  • chw1989
  • chw1989
  • 2012年04月12日 12:54
  • 11331

多线程实例

  • 2014年03月23日 13:48
  • 1.02MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:典型多线程小实例:球的运动
举报原因:
原因补充:

(最多只允许输入30个字)