Java 事件适配器 Adapter

 

事件适配器Adapters

  在上一篇文章中:

  http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html

  第二个例子中,可以看到要实现相应的事件监听器接口,就必须实现其中的所有方法。

  有的接口中包含多个方法(多个事件处理器),而有时我们只需要其中的一两个,这时候其他方法就只是空实现。

 

  为简化编程,JDK针对大多数事件监听器接口定义了相应的实现类,我们称之为事件适配器(Adapter)类

  在适配器类中,实现了相应监听器接口的所有方法,但不做任何事情,即这些Adapter类中的方法都是空的。

  只要继承适配器类,就等于实现了相应的监听器接口。

  如果要对某类事件的某种情况进行处理,只要覆盖相应的方法就可以了,其他的方法再也不用简单实现了。

  所以你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法。

 

  但是要注意适配器这里用的是继承extends,而Java是单继承的机制。如果想用作事件监听器的类已经继承了别的类,就不能再继承适配器了,只能去实现事件监听器接口了。

 

程序实例

   将上文中的例子用适配器重新实现以下,可以看到少了很多空方法。

适配器使用实例
package com.learnjava.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Date;

public class MyAdapterTest extends MouseAdapter
{
    private Frame frame;
    private Label label;
    private Button button;
    private TextField textField;

    public void go()
    {

        frame = new Frame("My Frame");
        // 加上窗口监听器,其中主要实现了退出功能
        frame.addWindowListener(new MyWindowListener2());

        // 加一个标签
        label = new Label("This is my Window");
        frame.add(label, BorderLayout.NORTH);

        // 加一个按钮
        button = new Button("MyButton");
        frame.add(button, BorderLayout.WEST);

        // 设置按钮事件监听器,按钮按下时会向控制台输出信息
        button.addActionListener(new MyButtonListener2());

        // 加一个文本编辑框
        textField = new TextField(40);
        frame.add(textField, BorderLayout.SOUTH);

        // 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是this
        frame.addMouseListener(this);
        frame.addMouseMotionListener(this);
        // 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上

        // 设置刚好能容纳这些控件的尺寸
        frame.pack();
        // 设置为可见
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        MyWindow window = new MyWindow();

        window.go();
    }

    @Override
    public void mouseMoved(MouseEvent e)
    {
        String str = "x = " + e.getX() + ", y = " + e.getY();
        this.textField.setText(str);
        System.out.println(str);
    }

    @Override
    public void mouseExited(MouseEvent e)
    {
        this.textField.setText("the mouse has exited.");
    }

}

class MyButtonListener2 implements ActionListener
{
    // 因为ActionListener只有一个方法,所以没有适配器

    @SuppressWarnings("deprecation")
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // 输出信息
        System.out.println("The Button is pressed!");

        // 输出时间戳
        Long time = e.getWhen();
        System.out.println("timestamp: " + time);

        // 日期时间
        Date date = new Date(time);
        System.out.println(date.toLocaleString());

    }

}

class MyWindowListener2 extends WindowAdapter
{
    @Override
    public void windowClosing(WindowEvent e)
    {
        System.out.println("windowClosing");
        // 退出
        System.exit(0);
    }

}

 

参考资料

  张龙老师Java SE教学视频。

posted @ 2013-02-07 16:55  圣骑士wind  阅读(10331)  评论(0编辑  收藏  举报