EchoDemo's Blogs

Java中的AWT事件处理

1、AWT事件处理基本概念

AWT事件的处理过程中,主要涉及三类对象。

(1)Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent。其实例在该事件发生时由系统自动产生。每一种事件都对应专门的监听者。

(2)Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。事件源自己不处理事件,而是把在其自身所有可能发生的事件委托给事件监听器来处理。

(3)Event Monitor(事件监听器):接收事件对象并对其进行处理的类的对象,通常其中某个成员方法对事件进行相应的处理。

2、事件

AWT的相关事件继承于java.awt.AWTEvent类,这些事件分为两大类:低级事件和高级事件。

(1)低级事件是指基于组件和容器的事件,当一个组件发生事件,如鼠标进入、点击、拖放或组件的窗口开关等时,触发了组件事件。如:组件事件、容器事件、窗口事件、焦点事件、键盘事件、鼠标事件。

(2)高级事件是基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类。比如,按下按钮和在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,选中项目列表的某一条会触发ItemEvent事件。

3、事件监听器

事件监听器通常是一个类,该类必须实现与该事件类型相对应的接口。对应的接口被称之为事件监听器接口。事件监听器接口类的名称与事件类的名称相对应,例如:MouseEvent事件类的监听器接口名为MouseListener。

4、事件适配器类

Java语言为一些事件监听提供了适配器(Adapter)。我们可以通过继承事件对应的Adapter类,重写所需要的方法,无关的方法则不用实现。事件适配器为我们提供了一种简单的实现监听器的手段,可以缩短程序代码。java.awt.event包中定义的事件适配器类包括以下7个:MouseAdapter(鼠标适配器)、MouseMotionAdapter(鼠标运动适配器)、KeyAdapter(键盘适配器)、WindowAdapter(窗口适配器)、ComponentAdapter(组件适配器)、ComtainerAdapter(容器适配器)、FocusAdapter(焦点适配器)。

5、示例

package com.iotek.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ListenerDemo {

    public static void main(String[] args) {
        MyFrame7 frame7=new MyFrame7("Listener");
    }
}

class MyFrame7 extends Frame{

    private Panel card_panel=null;
    private Panel ctrol_panel=null;
    private CardLayout cardLayout=null;
    private FlowLayout flowLayout=null;
    private Label lb_1,lb_2,lb_3,lb_4;
    private TextField tf_contentField;
    private Button btn_1,btn_2,btn_3,btn_4;

    public MyFrame7(String title){
        super(title);
        init();
        registerListener();
    }
    /*
     * 在一个窗口当中设置两个面板,上面的面板设置成CardLayout布局管理器,下面的面板设置成FlowLayout布局管理器。
     * 由于Frame默认是BorderLayout布局管理器,将上面的面板放进窗体的Center位置,下面的面板放在South位置。
     */
    public void init(){
        //创建两个面板容器
        card_panel=new Panel();
        ctrol_panel=new Panel();
        //创建两个布局管理器
        cardLayout=new CardLayout();
        flowLayout=new FlowLayout();
        //给面板容器设定指定的布局管理器
        card_panel.setLayout(cardLayout);
        ctrol_panel.setLayout(flowLayout);
        //声明创建四个标签控件和一个文本框控件。
        lb_1=new Label("First Page",Label.CENTER);
        lb_2=new Label("Second Page",Label.CENTER);
        tf_contentField=new TextField();//编辑文本框
        lb_3=new Label("Third Page",Label.CENTER);
        lb_4=new Label("Forth Page",Label.CENTER);
        //构建四个按钮对象
        btn_1=new Button("First");
        btn_2=new Button("Second");
        btn_3=new Button("Third");
        btn_4=new Button("Forth");
        //把按钮添加到控制面板
        ctrol_panel.add(btn_1);
        ctrol_panel.add(btn_2);
        ctrol_panel.add(btn_3);
        ctrol_panel.add(btn_4);
        //把四个标签控件和一个文本框控件添加到card_panel容器中。
        card_panel.add(lb_1);
        card_panel.add(lb_2);
        card_panel.add(tf_contentField);
        card_panel.add(lb_3);
        card_panel.add(lb_4);
        this.add(card_panel,BorderLayout.CENTER);
        this.add(ctrol_panel,BorderLayout.SOUTH);

        this.setSize(400, 300);
        this.setVisible(true);
    }

    private void registerListener(){
        /*
         * 产生一个事件监听器对象,给四个按钮注册同一个事件监听器。
         */
        BtnListener btnListener=new BtnListener();
        btn_1.addActionListener(btnListener);
        btn_2.addActionListener(btnListener);
        btn_3.addActionListener(btnListener);
        btn_4.addActionListener(btnListener);

        lb_1.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                lb_1.setText(e.getX()+":"+e.getY());
            }
        });

        lb_2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("鼠标移出");
            }
            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("鼠标移入");
            }
        });

        tf_contentField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyChar());
            }
        });

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    class BtnListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            /*System.out.println(e.getActionCommand());
            System.out.println(e.getSource());*/
            Object object=e.getSource();//获得当前点击的事件源
            if(object==btn_1){
                cardLayout.first(card_panel);//获得第一张
            }else if(object==btn_2){
                cardLayout.previous(card_panel);//获得前一张
            }else if(object==btn_3){
                cardLayout.next(card_panel);//获得下一张
            }else{
                cardLayout.last(card_panel);//获得最后一张
            }
        }
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------