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

原创 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){}
}
}
}

Java学习之道:多线程——让小球动起来(一)

在讲线程之前,我们先来谈谈进程。在我接触电脑的一段时间后,开始发现当打开任务管理器后,会有一个进程的显示,下面的映像名称里有很多的可执行文件。这些可执行文件有的是系统默认的,有的是我们打开的,他们都会...
  • u011511429
  • u011511429
  • 2013年07月31日 20:16
  • 5344

Java一个多线程的经典例子

import java.io.*; //多线程编程  public class MultiThread    {  public static void main(String args[])  {...
  • wlchn
  • wlchn
  • 2015年08月10日 16:58
  • 296

java多线程经典案例

java多线程典型案例:子线程执行10次,主线程执行100次,两者交替50次。
  • u014078192
  • u014078192
  • 2014年06月08日 14:27
  • 1922

java 多线程 点击按钮一次创建一个小球

练习使用多线程来实现点击按钮创建一个小球并且多个小球同时移动的效果
  • jack67722
  • jack67722
  • 2014年12月23日 23:51
  • 1418

第四讲:使用html5中的canvas标签画出一个球在指定区域内的运动

小球在一个区域运动 var canvas = document.getElementById('mc'); var cxt = canvas.getCo...
  • LIUMINGM900913
  • LIUMINGM900913
  • 2014年06月06日 21:48
  • 1716

Java小程序之球球大作战(基于Java线程实现)

Java小程序之球球大作战(基于Java线程实现) 一、游戏基本功能:        1、自己的小球可以随着鼠标的移动而改变坐标;        2、敌方小球不断的在界面中移动        3...
  • BlueSky_USC
  • BlueSky_USC
  • 2017年01月05日 00:44
  • 4050

微信小程序解密微信运动数据

微信小程序API-微信运动 https://mp.weixin.qq.com/debug/wxadoc/dev/api/we-run.html#wxgetwerundataobject思路:wx.l...
  • u012869196
  • u012869196
  • 2017年07月20日 14:48
  • 2357

用java模拟多球运动及碰撞

哈哈...经过上两篇文章以后,现在可以模拟出Vista七彩泡泡屏保的效果了(虽然模拟出来的效果跟屏保的效果暂时还相差很大,但原理是出来啦,而且更重要的是,我们能够模拟出来了),下面是代码./* * @...
  • bird_wang
  • bird_wang
  • 2008年02月27日 21:29
  • 2794

java多线程模仿发牌的小程序

package threadtest; import java.util.*; /**  * desc:  * User: weiguili(li5220008@gmail.com)  * D...
  • li5220008
  • li5220008
  • 2013年11月14日 11:04
  • 1939

用java模拟球随机运动

         最近想写个泡泡龙的游戏,可是遇到几个问题,其中有一个是模拟球的运行轨迹.其实以前也想过类似的问题,最初的时候是用了一个Vista的泡泡屏保然后是玩一个桌球游戏,我都在想着到底怎样计算...
  • bird_wang
  • bird_wang
  • 2008年02月25日 20:15
  • 1941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:典型多线程小实例:球的运动
举报原因:
原因补充:

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