接着上边的内容讲,我们要尝试实现一个能让多个小球同时运行的界面。
首先要实现的就是界面的实现,这一步就没有必要讲了。你要是不会,可以去参考我前边的技术文章。
接着new一个BallListener类继承MouseAdapter类,目的是在鼠标点击后画出一个球。
在画球前,我们先考虑一下要怎么实现,我们可以将每个小球的运动作为一个线程,也就是每点击一次鼠标,就会产生一个球,同时产生一个新的线程。但这种方法会产生很多线程,我们有更好的方法。我们可以创建一个数组队列,将球存进数组队列中,然后只需要一个线程来控制数组队列就行了。
我们让BallListerner实现Runnable类接口,并且创建数组队列。
ArrayList<Ball> al=new ArrayList<Ball>();
在mouseClicked()方法中,我们要实例化一个ball类,该类的作用是控制小球的运动。
public void mouseClicked(MouseEvent e){
if(g==null)
g=(Graphics2D)bg.getGraphics();
x=e.getX();
y=e.getY();
//实例化ball类
Ball ba=new Ball();
//将小球的初始位置传过去
ba.setY(x,y,g,bg);
//将小球添加进数组队列
al.add(ba);
}
之后就是写好run()方法了
public void run(){
//要让小球不断运动,所以要一直循环
while(true){
for(int i=0;i<al.size();i++){
//清除小球运动痕迹
al.get(i).clear();
//画一个新的小球
al.get(i).draw();
//更新小球的新一组位置
al.get(i).move();
}
try {
Thread.sleep(20);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
别忘了在界面类中加入
BallListener bl=new BallListener(this);
Thread th=new Thread(bl);
th.start();
现在我们已经完成了两个类了,只剩下ball类。Ball类需要继承Thread类,通过前边的代码和思路,其实ball类的内容大致出来了。在ball类中,我们要设置球的颜色、球的大小、球的运动方向,
球的运动速度,而这些都是通过随机数来实现。除此之外,我们还要写好clear()、draw()、move()方法,在这些方法中,自然是要用上前边的随机数。思路基本就是加减那些随机数,从而来实现不同球的运动。
在clear()方法中,我们会用到
color=bg.getContentPane().getBackground();
这行代码,这表示获取背景色,其实,想要掩盖已有的小球运动路径,方法就是用背景色画球,当然坐标要稍微处理一下。
一个能让多个小球同时运行的界面差不多就实现了。
最后,我提供了源代码和程序,可以自行下载。
百度云链接:https://pan.baidu.com/s/1o9O40WE 密码:u4mm
我下篇文章会讲小球运动的升级版,我们要实现的是自动产生小球,并且添加一张会动的背景图。届时将有三个线程(包括主线程),因此我还会讲到线程安全,并且为了界面顺畅,会用到双缓存和次画布的知识。