事件适配器

2020-11-18  本文已影响0人  编程人生

Java 语言 为一些Listener 接口提供了适配器类(Adapter)。可以通过继承事件所对应的Adapter 类,重写需要的方法,对不相关的事件不用实现。事件适配器提供了一种简单的实现监听器的手段,可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或者此类已有父类时,就无法采用事件适配器了。

如下列采用了鼠标适配器

import java.awt.*;

import java.awt.event.*;

public class MouseClickHandler extends MouseAdaper{

public void mouseClicked(MouseEvent e){..................}

}

java.awt.event包中定义的事件适配器类包括以下几个

ComponentAdapter 组件适配器

ContainerAdapter 容器适配器

FocusAdapter  焦点适配器

keyAdapter 键盘适配器

MouseAdapter 鼠标适配器

MouseMotionAdapter  鼠标运动适配器

WindowAdapter  窗口适配器

2.用内部类实现事件处理器

内部类(inner class)是被定义于另一个类中的类。 使用内部类的主要原因是由于

一个内部类的对象可以访问外部类的成员方法和变量,包括私有的成员

实现事件监听器时,采用内部类、匿名内部类编程非常容易实现其功能

编写事件驱动程序,内部类很方便。

/*

* TestInerClass.java

*

* Created on 2020年11月18日, 上午7:28

*

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*/

package mypkg;

import java.awt.*;

import java.awt.event.*;

public class TestInnerClass {

   private Frame f;

  private TextField tf;

  public void launchFrame(){

        f = new Frame("Inner classes example");

        tf =new TextField(30);

        Label label = new Label("Click and drag the mouse");

        f.add(label,BorderLayout.NORTH);

        f.add(tf,BorderLayout.SOUTH);

        f.addMouseMotionListener(new MyMouseMotionListener());//参数为内部类对象

        f.addWindowListener(new MyWindowListener());

        f.setSize(300,200);

        f.setVisible(true);

  }

  class MyMouseMotionListener extends MouseMotionAdapter{

          public void mouseDragged(MouseEvent e){

                String s = "Mouse dragging: x= "+e.getX()+"y = "+e.getY();

                tf.setText(s);

          }

  }

  class MyWindowListener extends WindowAdapter{

        public void windowClosing(WindowEvent e){

            System.exit(1);

        }

  }

  public static void main(String args[]){

        TestInnerClass tic = new TestInnerClass();

        tic.launchFrame();

  }

}

3.匿名类(Anonymous Class)

当一个内部类的类声明只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类。由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类构造方法。

/*

* AnonymousClass.java

*

* Created on 2020年11月18日, 下午11:25

*

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*/

package mypkg;

import java.awt.*;

import java.awt.event.*;

public class AnonymousClass {

    private Frame f;

    private TextField tf;

   public AnonymousClass(){

        f = new Frame("Inner classes example");

        tf = new TextField(30);

    }

    public void LaunchFrame(){

        Label label = new Label("Click and drag the mouse");

        f.add(label,BorderLayout.NORTH);

        f.add(tf,BorderLayout.SOUTH);

        f.addMouseMotionListener(new MouseMotionAdapter(){  //匿名类开始

            public void mouseDragged(MouseEvent e){

                String s = "Mouse dragging : x = "+e.getX()+"Y = "+e.getY();

                tf.setText(s);

            }

        });  //匿名类结束

      f.addWindowListener(new WindowAdapter(){    //匿名类开始

            public void windowClosing(WindowEvent e){

                System.out.print(1);

            }

      });

      f.setSize(300,200);

      f.setVisible(true);

    }

    public static void main(String args[]){

        AnonymousClass obj = new AnonymousClass();

        obj.LaunchFrame();

    }

}

上一篇下一篇

猜你喜欢

热点阅读