暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。
既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下:
public class ShapeFrame extends JFrame {
public void initUI(){
this.setTitle("线程动画");
this.setSize(700, 600);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
}
界面写好了,让线条动起来的前提是与一条线,所以接下来就要画线了,那就再创建一个类,在这个类中画出线条并定义运动的函数,需要定义的有线条的起始点,终点的坐标,运动的方向和速度,比较特别的是还需要定义一个方向的变量,变量的初始化我是将其全部定义在构造函数中,也可以在定义时初始化,这里将方向dir初始化为右。
接下来就要写出画线的函数,函数如下:
public void drawLine(Graphics2D g){
g.setStroke(new BasicStroke(width));
g.setColor(Color.BLACK);
g.drawLine(x1, y1, x2, y2);
}
主要有设置颜色,传递画笔,Graphics2D类继承了Graphics类,所以使用它创建画笔对象。
有了线条,下一步就是让它动以来,开始时先做简单的运动,上下左右四个方向的直线运动,这时别忘了定义方向变量,example:private static final int LEFT = 1;
以向右为例,mov函数使用switch(dir)判断,每个case中主要有两个操作,将x1,x2加上运动速度,在判断是否越界,若越界的话,就向另一个方向运动。实现:
switch (dir) {
case LEFT:
x1-=speed;
x2-=speed;
if(x1<=0){
dir=UP;
}
为了防止线条只增不减,还需要写一个清除的函数,这时还需定义四个变量,并在运动函数中将之前线条的起始终止坐标赋给这四个变量。函数中与画黑线相对,画白线就好。这是因为在运动前就将原坐标赋给后面用的四个变量,即画白线的地方是上一次画黑线的地方。所以画出来的效果就像运动起来一样。在调用这三个函数时,顺序应该是move--->clear-->drawline。否则会出现断断续续的黑白线。
只是这样,运行起来是不能画出线条的,还需要加上在窗体类中监听,这就有需要一个类实现接口,并在类中定义三个对象:
private ShapeFrame sf;
private ShapeLine line;
private Graphics2D g;
然后写构造函数:
public ThreadListener(ShapeFrame sf) {
this.sf = sf;
g = (Graphics2D) sf.getGraphics();
}
这是用于创建监听时传递窗体对象。
再在run函数里边依次调用move--->clear-->drawline,并且在异常处理中是线程睡眠500ms。这里的run函数是在继承MouseAdapter和实现Runnable后自动添加的函数,是定义在Runnable接口中的函数。在mouseReleased中创建划线类的对象,用于run中的判断。实现接口时,可重写接口中的函数。
接下来就只需要在窗口类中加上监听,创建线程,并且让线程开始就可以了。需要注意的是,在创建线程时,要传递对象。代码:
ThreadListener l = new ThreadListener(this);
this.addMouseListener(l);
Thread t = new Thread(l);
t.start();
这个任务主要是为了让我们清楚线程的使用,就我的体会而言,加监听器是需要实现Runnable类,并使用了run函数。仅仅做了这个小项目,只是会使用线程,但对线程的理解并不清楚,还需要加深思考和理解。