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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

/**

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

*几乎每一处都有注释,只要一点时间就能看懂

*适合初学者学习交流

*这是我学习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){}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航