AWT事件处理

AWT事件处理基本概念

AWT事件处理过程中,主要涉及3类对象:

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

②   Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。

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

注:Java采取了事件委托处理模型,事件源自己不处理事件,而是把其自身所有可能发生的事件委托给事件监听器来处理。

事件:

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

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


ComponentEvent


组件事件:组件尺寸的变化、移动


ContainerEvent


容器事件:组件增加、移动


WindowEvent


窗口事件:关闭窗口、窗口闭合、图标化


FocusEvent


焦点事件:焦点的获得和丢失


KeyEvent


键盘事件:键按下、释放


MouseEvent


鼠标事件:鼠标单击、移动

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


ActionEvent


动作事件:按钮按下,TextField中按下Enter键


AdjustmentEvent


调节事件:在滚动条上移动滑块以调节数值


ItemEvent


项目事件:选择项目,不选择”项目改变”


TextEvent


文本事件:文本对象改变

事件监听器:

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

事件适配器类:

Java为一些事件监听器接口提供了适配器类(Adapter)。我们可以通过继承事件所对应的Adapter类,重写所需要的方法,无关的方法则不用实现。事件适配器为我们提供了一种简单的实现监听器的手段,可以缩短程序代码。

Java.awt.event包中定义的事件适配器类包括以下7个:

①   MouseAdapter(鼠标适配器)

②   MouseMotionAdapter(鼠标运动适配器)

③   KetAdapter(键盘适配器)

④   WindowAdapter(窗口适配器)

⑤   ComponentAdapter(组件适配器)

⑥   ContainerAdapter(容器适配器)

⑦   FocusAdapter(焦点适配器)

在上一篇卡片布局中实现按钮翻动效果及窗口关闭等事件

在方法中添加

 1     private void registerListener() {
 2         // 产生一个事件监听器对象
 3         BtnListener btnListener = new BtnListener();
 4         // 给4个按钮注册监听同一个事件监听器
 5         btnFirst.addActionListener(btnListener);
 6         btnPrevious.addActionListener(btnListener);
 7         btnNext.addActionListener(btnListener);
 8         btnLast.addActionListener(btnListener);
 9
10         //第一张中鼠标移动事件,显示坐标
11         lb1.addMouseMotionListener(new MouseAdapter() {
12             @Override
13             public void mouseMoved(MouseEvent e) {
14                 lb1.setText(e.getX() + ":" + e.getY());
15             }
16         });
17
18         //第二张中鼠标移入、移出事件
19         lb2.addMouseListener(new MouseAdapter() {
20             @Override
21             public void mouseExited(MouseEvent e) {
22                 System.out.println("鼠标移出");
23             }
24
25             @Override
26             public void mouseEntered(MouseEvent e) {
27                 System.out.println("鼠标移入");
28             }
29         });
30
31         //文本中键盘按下事件
32         txtContent.addKeyListener(new KeyAdapter() {
33             @Override
34             public void keyPressed(KeyEvent e) {
35                 System.out.println(e.getKeyChar());
36             }
37         });
38
39         //窗口关闭事件
40         this.addWindowListener(new WindowAdapter() {
41             @Override
42             public void windowClosing(WindowEvent e) {
43                 System.exit(0);
44             }
45         });
46     }
47
48     // 成员内部类
49     class BtnListener implements ActionListener {
50
51         @Override
52         public void actionPerformed(ActionEvent e) {
53             /*
54              * System.out.println(e.getActionCommand());
55              * System.out.println(e.getSource());
56              */
57             Object obj = e.getSource();// 获得当前点击的事件源
58             if (obj == btnFirst) {
59                 cardLayout.first(cardPanel);
60             } else if (obj == btnPrevious) {
61                 cardLayout.previous(cardPanel);
62             } else if (obj == btnNext) {
63                 cardLayout.next(cardPanel);
64             } else if (obj == btnLast) {
65                 cardLayout.last(cardPanel);
66             }
67         }
68     }

卡片布局中的方法新增部分

在构造函数中调用方法

1 super(title); 2 init(); 3 registerListener(); 4

就可以实现按钮事件,及上述方法中提及的事件。

完整的方法如下

  1 class MyFrame7 extends Frame {
  2     private Panel cardPanel = null;
  3     private Panel ctrolPanel = null;
  4     private CardLayout cardLayout = null;
  5     private FlowLayout flowLayout = null;
  6     private Label lb1, lb2, lb3, lb4;
  7     private Button btnFirst, btnPrevious, btnNext, btnLast;
  8     private TextField txtContent;
  9
 10     public MyFrame7(String title) {
 11         super(title);
 12         init();
 13         registerListener();
 14     }
 15
 16     public void init() {
 17         // 创建2个面板容器
 18         cardPanel = new Panel();
 19         ctrolPanel = new Panel();
 20
 21         // 创建2个布局管理器
 22         cardLayout = new CardLayout();
 23         flowLayout = new FlowLayout();
 24
 25         // 给容器设置指定的布局管理器
 26         cardPanel.setLayout(cardLayout);// 卡片容器中放置卡片布局
 27         ctrolPanel.setLayout(flowLayout);// 控制容器放置流式布局
 28
 29         // 声明创建4个标签控件和一个文本框控件
 30         lb1 = new Label("第一页内容", Label.CENTER);
 31         lb2 = new Label("第二页内容", Label.CENTER);
 32         txtContent = new TextField();// 编辑文本框
 33         lb3 = new Label("第四页内容", Label.CENTER);
 34         lb4 = new Label("第五页内容", Label.CENTER);
 35
 36         // 构建四个按钮对象
 37         btnFirst = new Button("第一张");
 38         btnPrevious = new Button("上一张");
 39         btnNext = new Button("下一张");
 40         btnLast = new Button("最后一张");
 41         ctrolPanel.add(btnFirst);
 42         ctrolPanel.add(btnPrevious);
 43         ctrolPanel.add(btnNext);
 44         ctrolPanel.add(btnLast);
 45
 46         // 把四个标签控件和一个文本框控件添加到卡片容器中
 47         cardPanel.add(lb1);
 48         cardPanel.add(lb2);
 49         cardPanel.add(txtContent);
 50         cardPanel.add(lb3);
 51         cardPanel.add(lb4);
 52         this.add(cardPanel, BorderLayout.CENTER);// 将卡片容器放在中部
 53         this.add(ctrolPanel, BorderLayout.SOUTH);// 将控制容器放在南部
 54         this.setSize(400, 300);
 55         this.setVisible(true);
 56     }
 57
 58     private void registerListener() {
 59         // 产生一个事件监听器对象
 60         BtnListener btnListener = new BtnListener();
 61         // 给4个按钮注册监听同一个事件监听器
 62         btnFirst.addActionListener(btnListener);
 63         btnPrevious.addActionListener(btnListener);
 64         btnNext.addActionListener(btnListener);
 65         btnLast.addActionListener(btnListener);
 66
 67         //第一张中鼠标移动事件,显示坐标
 68         lb1.addMouseMotionListener(new MouseAdapter() {
 69             @Override
 70             public void mouseMoved(MouseEvent e) {
 71                 lb1.setText(e.getX() + ":" + e.getY());
 72             }
 73         });
 74
 75         //第二张中鼠标移入、移出事件
 76         lb2.addMouseListener(new MouseAdapter() {
 77             @Override
 78             public void mouseExited(MouseEvent e) {
 79                 System.out.println("鼠标移出");
 80             }
 81
 82             @Override
 83             public void mouseEntered(MouseEvent e) {
 84                 System.out.println("鼠标移入");
 85             }
 86         });
 87
 88         //文本中键盘按下事件
 89         txtContent.addKeyListener(new KeyAdapter() {
 90             @Override
 91             public void keyPressed(KeyEvent e) {
 92                 System.out.println(e.getKeyChar());
 93             }
 94         });
 95
 96         //窗口关闭事件
 97         this.addWindowListener(new WindowAdapter() {
 98             @Override
 99             public void windowClosing(WindowEvent e) {
100                 System.exit(0);
101             }
102         });
103     }
104
105     // 成员内部类
106     class BtnListener implements ActionListener {
107
108         @Override
109         public void actionPerformed(ActionEvent e) {
110             /*
111              * System.out.println(e.getActionCommand());
112              * System.out.println(e.getSource());
113              */
114             Object obj = e.getSource();// 获得当前点击的事件源
115             if (obj == btnFirst) {
116                 cardLayout.first(cardPanel);
117             } else if (obj == btnPrevious) {
118                 cardLayout.previous(cardPanel);
119             } else if (obj == btnNext) {
120                 cardLayout.next(cardPanel);
121             } else if (obj == btnLast) {
122                 cardLayout.last(cardPanel);
123             }
124         }
125     }
126 }

只需在主方法中实例化就可以使用

时间: 2024-08-05 22:33:42

AWT事件处理的相关文章

core java 8~9(GUI & AWT事件处理机制)

MODULE 8 GUIs--------------------------------GUI中的包: java.awt.*; javax.swing.*; java.awt.event.*; 要求:1)了解GUI的开发流程:2)掌握常用的布局管理器 开发GUI图形界面的步骤-------------------------------1.选择容器 1)Frame容器 有缩小/最大化/关闭等按钮,顶层容器 2)Dialog对话框 通常依赖于容器,不单独出现 3)Applet 依赖于浏览器的支持

Java学习笔记--AWT事件处理

1.事件模型 在整个事件触发和相应的过程中,主要涉及一下3类对象 (1) 事件源 : 引起时间的GUI对象,如各类组件(Button,Label,TextField),容器组件(Frame,panel,ScrallPane等) (2) 事件类 : 事件类是引发的GUI时间封装成的类,如鼠标事件 MouseEvent (3) 事件处理器 : 接收事件类 1.1 事件类 低级事件 ComponentEvent( 组件事件:组件尺寸的变化,移动) ContainerEvent( 容器事件:组件增加,移

Java事件处理

1.事件的处理过程,主要涉及三类对象: Event Source(事件源):事件发生的场所,通常就是各个组件,例如:按钮.窗口.菜单等等. Event(事件):事件封装了GUI组件上发生的特定事情(通常就是一次用户操作).(EventObject) EventListener(事件监听器):负责监听事件源发生的事件,并对各种事件做出相应处理. 2.AWT事件处理机制:一种委派式(Delegation)事件处理方式. AWT事件处理机制的步骤: 实现事件监听器类,该监听器类是一个特殊的Java类,

第11章 AWT编程

第11章 AWT编程 AWT全称是抽象窗口工具集 GUI 图形用户界面 AWT缺点 1.图形显示丑陋 2.AWT组件这能使用这些操作系统共有的组件 3.AWT非常笨拙,是非面向对象的编程模式 总体上Swing组件代替了大部分AWT组件,对AWT有很好的补充和加强 Swing仅提供了能力更强大的用户界面组件,即使是完成采用Swing编写的组件也依然要使用AWT的事件处理机制 java.awt包中提供了两个基类表示图形界面元素 Component 和MenuComponent 代表一个能以图形化方式

GUI(图形用户界面)

AWT概述 GUI全称是Graphical User Interface,即图形用户界面,即应用程序提供给用户操作的图形界面,包括窗口.菜单.按钮.工具栏和其它各种图形界面元素 GUI设计提供了丰富的类库,这些类分别位于java.awt和javax.swing包中,简称为AWT和Swing Swing不仅实现了AWT中的所有功能,而且提供了更加丰富的组件和功能,足以满足GUI设计的一切需求. AWT事件处理事件处理机制 事件处理机制专门用于响应用户的操作,比如,想要响应用户的点击鼠标.按下键盘等

Java模式开发之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 击鼓传花便是

GUI 基础

java基础教程-GUI 建立GUIs 本模块讲述图形用户界面的建立及布局.它介绍了抽象视窗工具包(AWT),一种建立GUIs的类包. AWT提供用于所有Java applets及应用程序中的基本GUI组件,还为应用程序提供与机器的界面.这将保证一台计算机上出现的东西与另一台上的相一致. 在学AWT之前,简单回顾一下对象层次.记住,超类是可以扩展的,它们的属性是可继承的.而且,类可以被抽象化,这就是说,它们是可被分成子类的模板,子类用于类的具体实现. 显示在屏幕上的每个GUI组件都是抽象类组件的

Java课后思考题

1.简述path和classpath的区别. path:path环境变量是系统环境变量中的一种,它用于保存一系列可执行文件的路径,每个路径之间以分号分隔.当在命令行窗口运行一个可执行文件时,操作系统首先会在当前目录下查找是否存在该文件,如果不存在会继续在path环境变量中定义的路径下去寻找这个文件,如果仍未找到,系统会报错. classpath:classpath环境变量也是系统环境变量中的一种,它用于保存一系列类(.class)文件的路径.当Java虚拟机需要运行一个类时,会先在classpa

GOF23设计模式之观察者模式(observer)

一.观察者模式概述 观察者模式主要用于 1 :N 的通知.当一个对象(目标对象 Subject 或 Observable)的状态变化时,它需要通知一系列对象(观察者对象 Observer),令它们做出响应. 通知观察者的方式: (1)推   每次都会把通知以广播的方式发送给所有观察者,所有观察者只能被动接收. (2)拉   观察者只要知道有情况即可.至于什么时候获取内容,获取哪些内容,都可以自主决定. 二.观察者模式示例代码 1 /** 2 * 观察者对象接口 3 * @author CL 4