• 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教学视频。

  • 相关阅读:
    qemu进程页表和EPT的同步问题
    Linux进程虚拟地址空间管理2
    qemu-kvm内存虚拟化1
    LInux进程虚拟地址空间的管理
    Linux下的文件系统2
    LInux中的文件系统1
    Linux IPC之管道通信
    操作系统中的特权级检查
    Linux下的信号机制
    进程的挂起、阻塞和睡眠
  • 原文地址:https://www.cnblogs.com/mengdd/p/2908837.html
Copyright © 2020-2023  润新知