相信大家都对屏幕保护中的小球碰撞动画深有印象吧,许多色彩缤纷的小球在屏幕上滚动,碰撞,然后一直重复如此过程......现在就让我们自己尝试去做一下吧,或许你做的比它的要更好呦!
不必说,最重要也是最先弄的,自然是要产生小球啦,因此就要先创建一个球的线程类。这里先放上一些关于线程创建的知识,有助于大家巩固记忆啦。
线程的创建有两种方式,分别为继承Thread类(已经实现了Runnable接口)与实现Runnable接口。
1.Thread类
常用方法包括:start()、interrupt()、join()、run()方法等。start()方法用于启动线程,run()方法为线程实现功能的方法,可以根据需求覆写run()方法。
构造函数8个,常用4个:
Thread thread=new Thread(); //无参的Thread类构造函数
Thread thread=new Thread(Runnable simple); //参数为实现Runnable接口类对象的构造函数
Thread thread=new Thread("ThreadName"); //参数为线程名称的构造函数
Thread thread=new Thread(Runnable simple,"ThreadName"); //无参的Thread类构造函数
2.Runnable接口
它只有一个方法就是run()方法,实现Runnable()接口后必须覆写run()方法。
嗯,如上所说,先创建一个球的线程类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;
import javax.swing.JPanel;
public class MyThread extends Thread{
private JPanel panel;
private int x,y;//坐标位置
private int radius=50;//球半径
private int vx,vy;//横纵坐标该变量
private Color color;
public MyThread(JPanel panel)
{
this.panel=panel;
Random random=new Random();//创建一个随机类变量
vx=random.nextInt(20)+10;
vy=random.nextInt(10)+5;
radius=random.nextInt(10)+20;
color=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
}
//重写run的方法
public void run()
{
Random random=new Random();
//Graphics g=panel.getGraphics();//获得窗体界面
Graphics2D g2=(Graphics2D)panel.getGraphics();
panel.setBackground(Color.BLACK);
while(true)
{
try{
Thread.sleep(100);//调用线程睡眠方法,让线程能暂缓进行
}catch(InterruptedException e ){
e.printStackTrace();
}
//覆盖小球先前的轨迹
g2.setColor(panel.getBackground());//获得窗体背景颜色
g2.fillOval(x, y, 2*radius, 2*radius);
x+=vx;
y+=vy;
g2.setColor(color);
g2.fillOval(x, y, 2*radius, 2*radius);
//若小球碰撞到面板边缘,则反弹
if(x<0||x>panel.getWidth()-2*radius)
{
vx=-vx;
}
if(y<0||y>panel.getHeight()-2*radius)
{
vy=-vy;
}
}
}
}
这里大概要注意两点吧:
1.要覆盖小球先前的轨迹,不然所有时刻的轨迹都会显现在窗体上。
2.考虑小球出界时的情况,设定反弹条件
之后当然就是写一个测试类
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestFrame {
private JPanel centerpanel;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestFrame tf=new TestFrame();
tf.init();
}
//初始化界面的方法
public void init()
{
JFrame jf=new JFrame("线程入门");
jf.setSize(800, 600);
jf.setDefaultCloseOperation(3);
jf.setResizable(false);
JPanel northpanel=new JPanel();
northpanel.setSize(800, 200);
JButton jbu=new JButton("开始");
//jbu.setPreferredSize(new Dimension(50,50));
jbu.addActionListener(al);
northpanel.add(jbu);
jf.add(northpanel,BorderLayout.NORTH);
centerpanel=new JPanel();
jf.add(centerpanel,BorderLayout.CENTER);
jf.setVisible(true);
}
ActionListener al=new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
MyThread thread=new MyThread(centerpanel);//创建一个线程
thread.start();//启动线程
}};
}
提醒下的是,最好创建两个面板,北边面板放按钮,中间面板当画布,这里小球运动时就不会影响到按钮的轮廓。
这样操作完后,就能产生许许多多的小球啦。