初始线程

      暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。

       既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承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函数。仅仅做了这个小项目,只是会使用线程,但对线程的理解并不清楚,还需要加深思考和理解。

猜你喜欢

转载自15700786134.iteye.com/blog/2228457