多线程(碰撞的球)
1.要求
本实例运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。
2.原理
- 多线程是为了使得多个线程并行地工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
- 碰撞的小球运用多线程实现,球的运动速度随着时间的变动可能加快,这也是体现多线程的好处之一。从左右两侧出现的球是运用两个线程分别控制的。当碰到面板的边缘时则折回。
3.语法
- BallFrame类继承JFramea类实现ActionListener与ChangeListeneri接口。实现ActionListener接口必须实现actionPerformed()方法,实现 ChangeListenert接口必须实现state Changed()方法。在BallFrame类的构造方法中创建面板并设置面板的大小、位置、背景颜色;创建预览面板并设置预览面板的大小、位置与背景颜色:创建文本框作为状态栏并设置其大小、位置,初始不可编辑;创建红绿蓝和球大小的四个标签,并设置标签的位置,创建红绿蓝以及球大小四个滑块并设置滑块的大小、位置、填充滑块、绘制勾号标记、设置主要的勾号标记大小、设置次要的勾号标记大小、设置主要刻度的数字标记以及添加监听器。创建注入球按钮,当单击该按钮时触发事件在面板中导入两个运动的球。创建窗体容器并设置其布局为空,这样可以在窗体容器中随意摆放组件,再将相关的组件诉加到窗体容器中,设置窗体容器的位置大小以及可视化,当关闭窗体时调用系统的exit(0)方法安全退出程序。
- BallFrame类的actionPerformed()方法根据红绿蓝滑块中指定的颜色获取当前球的颜色。根据面板、球的大小以及球的颜色创建 RightBall和LeftBall对象,并启动线程。这样球就可以注入到面板中运动了。
- BallFrame类的stateChanged()方法获得预览面板中的画笔,在预览面板的中心画一个圆,并设置该图形的颜色为白色和填充外接指定矩形框的圆。根据设置球大小的滑块值设置圆的半径。重新设置图形的颜色和填充外接指定矩形框的圆, Graphics类的dispose()方法将所画的圆显示出来。
- LeftBall类和 RightBall类继承 Thread类扩展run()方法,其构造方法获得球的面板、大小以及颜色。run()方法根据面板的 getGraphics()方法获得球的图形,并根据获得的球的大小计算画球时横纵坐标的最大坐标。运用条件始终为真进行循环,球毎移动一步,将上一步画的球的颜色设置为白色来将球擦掉,并获得新的球的横纵坐标。如果球运动到面板的边缘则球转向。设置左球与右球毎隔30毫秒移动一次。
4.代码
主程序:
public class rw34 {
//操作运用线程实现碰撞的球的类
public static void main(String[] args) {
// TODO Auto-generated method stub
new BallFrame();//实例化对象
}
}
对窗口界面进行设计:
class BallFrame extends JFrame implements ActionListener,ChangeListener{
private static final long serialVersionUID=1L;
JPanel panel;//画板
JPanel preview;//预览画板
JSlider red;//红色滑块
JSlider blue;//蓝色滑块
JSlider green;//绿色滑块
JSlider JS_SIZE;//滑块的大小
int x=45,y=45;//方位
int BALL_SIZE=30;//球的大小
public BallFrame() {
//构造方法进行初始化
super("碰撞的球");
panel=new JPanel();//创建面板
panel.setBounds(20, 0, 450, 200);//设置面板的位置及大小
panel.setBackground(Color.WHITE);//面板背景色为白色
preview=new JPanel(); //创建预览球的面板
preview.setBounds(350,220,120,120);
preview.setBackground(Color.WHITE);//设置状态栏
JTextField status=new JTextField("请选择球的颜色、大小然后单击按钮");
status.setBounds(1,404,492,20);//设置状态栏的位置以及大小
status.setEditable(false);//初始不能编辑
JLabel redLabel=new JLabel("红");//创建红色标签
redLabel.setBounds(20,215,30,20);//设置红色标签的位置以及大小
JLabel greenLabel=