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(焦点适配器)
在上一篇卡片布局中实现按钮翻动效果及窗口关闭等事件
在方法中添加
private void registerListener() {
// 产生一个事件监听器对象
BtnListener btnListener = new BtnListener();
// 给4个按钮注册监听同一个事件监听器
btnFirst.addActionListener(btnListener);
btnPrevious.addActionListener(btnListener);
btnNext.addActionListener(btnListener);
btnLast.addActionListener(btnListener);
//第一张中鼠标移动事件,显示坐标
lb1.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
lb1.setText(e.getX() + ":" + e.getY());
}
});
//第二张中鼠标移入、移出事件
lb2.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标移出");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标移入");
}
});
//文本中键盘按下事件
txtContent.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 obj = e.getSource();// 获得当前点击的事件源
if (obj == btnFirst) {
cardLayout.first(cardPanel);
} else if (obj == btnPrevious) {
cardLayout.previous(cardPanel);
} else if (obj == btnNext) {
cardLayout.next(cardPanel);
} else if (obj == btnLast) {
cardLayout.last(cardPanel);
}
}
}
卡片布局中的方法新增部分
在构造函数中调用方法
super(title); init(); registerListener();
就可以实现按钮事件,及上述方法中提及的事件。
完整的方法如下
class MyFrame7 extends Frame {
private Panel cardPanel = null;
private Panel ctrolPanel = null;
private CardLayout cardLayout = null;
private FlowLayout flowLayout = null;
private Label lb1, lb2, lb3, lb4;
private Button btnFirst, btnPrevious, btnNext, btnLast;
private TextField txtContent;
public MyFrame7(String title) {
super(title);
init();
registerListener();
}
public void init() {
// 创建2个面板容器
cardPanel = new Panel();
ctrolPanel = new Panel();
// 创建2个布局管理器
cardLayout = new CardLayout();
flowLayout = new FlowLayout();
// 给容器设置指定的布局管理器
cardPanel.setLayout(cardLayout);// 卡片容器中放置卡片布局
ctrolPanel.setLayout(flowLayout);// 控制容器放置流式布局
// 声明创建4个标签控件和一个文本框控件
lb1 = new Label("第一页内容", Label.CENTER);
lb2 = new Label("第二页内容", Label.CENTER);
txtContent = new TextField();// 编辑文本框
lb3 = new Label("第四页内容", Label.CENTER);
lb4 = new Label("第五页内容", Label.CENTER);
// 构建四个按钮对象
btnFirst = new Button("第一张");
btnPrevious = new Button("上一张");
btnNext = new Button("下一张");
btnLast = new Button("最后一张");
ctrolPanel.add(btnFirst);
ctrolPanel.add(btnPrevious);
ctrolPanel.add(btnNext);
ctrolPanel.add(btnLast);
// 把四个标签控件和一个文本框控件添加到卡片容器中
cardPanel.add(lb1);
cardPanel.add(lb2);
cardPanel.add(txtContent);
cardPanel.add(lb3);
cardPanel.add(lb4);
this.add(cardPanel, BorderLayout.CENTER);// 将卡片容器放在中部
this.add(ctrolPanel, BorderLayout.SOUTH);// 将控制容器放在南部
this.setSize(400, 300);
this.setVisible(true);
}
private void registerListener() {
// 产生一个事件监听器对象
BtnListener btnListener = new BtnListener();
// 给4个按钮注册监听同一个事件监听器
btnFirst.addActionListener(btnListener);
btnPrevious.addActionListener(btnListener);
btnNext.addActionListener(btnListener);
btnLast.addActionListener(btnListener);
//第一张中鼠标移动事件,显示坐标
lb1.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
lb1.setText(e.getX() + ":" + e.getY());
}
});
//第二张中鼠标移入、移出事件
lb2.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标移出");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标移入");
}
});
//文本中键盘按下事件
txtContent.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 obj = e.getSource();// 获得当前点击的事件源
if (obj == btnFirst) {
cardLayout.first(cardPanel);
} else if (obj == btnPrevious) {
cardLayout.previous(cardPanel);
} else if (obj == btnNext) {
cardLayout.next(cardPanel);
} else if (obj == btnLast) {
cardLayout.last(cardPanel);
}
}
}
}
只需在主方法中实例化就可以使用
AWT事件处理的更多相关文章
- core java 8~9(GUI & AWT事件处理机制)
MODULE 8 GUIs--------------------------------GUI中的包: java.awt.*; javax.swing.*; java.awt.event.*; 要求 ...
- Java学习笔记--AWT事件处理
1.事件模型 在整个事件触发和相应的过程中,主要涉及一下3类对象 (1) 事件源 : 引起时间的GUI对象,如各类组件(Button,Label,TextField),容器组件(Frame,panel ...
- Java核心技术卷一基础知识-第8章-事件处理-读书笔记
第8章 事件处理 本章内容: * 事件处理基础 * 动作 * 鼠标事件 * AWT事件继承层次 8.1 事件处理基础 在AWT所知的事件范围内,完全可以控制事件从事件源(event source)例如 ...
- Java程序设计11——GUI设计与事件处理B
4 Java事件模型的流程 为了使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制. 在事件处理的过程中,主要涉及3类对象: 1.Event Source(事件源):事件发生的场所,通常就是 ...
- Java学习笔记--Swing用户界面组件
很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- 《java与模式》
2012年3月 随笔档案 - java_my_life - 博客园--此网友 12年的博客都是和模式有关的,希望可以多看看.http://www.cnblogs.com/java-my-life/ar ...
- 马凯军201771010116《面向对象与程序设计Java》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 理论知识与学习部分 事件处理基础 事件源(event source):能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事 ...
- 刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 1.理论知识 (1)任何支持GUI的操作环境都要不断地监视按键或点击鼠标这样的事件. JAVA这样的面向对象语言,都将事件的相关的信息 ...
随机推荐
- JsonException: Max allowed object depth reached while trying to export from type System.Single
在进行类转json字符串时,报错JsonException: Max allowed object depth reached while trying to export from type Sys ...
- [转]细说SQL Server中的加密
简介 加密是指通过使用密钥或密码对数据进行模糊处理的过程.在SQL Server中,加密并不能替代其他的安全设置,比如防止未被授权的人访问数据库或是数据库实例所在的Windows系统,甚至是数据库所在 ...
- windows下CMake使用图文手册 Part 3
例子3: 构建动态库(.dll) 静态库(.lib) 采用和例子2一样的文件,但删除了main.cpp E:. │ CMakeLists.txt │ ...
- [转载]Vivado轻松实现IP封装
Vivado轻松实现IP封装 1.新建一个测试工程 工程化的设计方法是离不开工程的,第一步往往都是新建工程,后面我会学习去工程化的开发方法,可能会更加高效. 2.利用向导完成IP封装 2.1.启动IP ...
- javascript的地基
有了良好的基础,才能在其上创造有价值的东西. 回顾一下以往自己javascript应用的开发经历,似乎很少去思考和总结js的运行机制.现在我就来整理整理 1. 以<编译原理>的一段话开头: ...
- 二模15day1解题报告
T1.合并序列(minval) 给出长为 n的AB两个序列求两两相加中最小的n个. 据说有证明(在蓝书上,优先队列部分)先把A[1~n]+b[1]入队,然后每取一个a[x]+b[y]就把a[x]+b[ ...
- window.onload和window.document.readystate的探究
在编写前端页面的时候,我们时常需要对页面加载的状态进行判断,以便进行相应的操作. 比如在移动端,时常需要在页面完全加载完成之前,先显示一个loading的图标,等待页面完成加载完成后,才显示出真正要展 ...
- NodeJS学习三之API
Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务.这导致Node大量采用异步操作(asynchronous opertion),即任务不是马上执行,而是插 ...
- Windows Server 2008下asp+access无法登陆问题总结
今日把一套陈旧的企业办公平台部署至公司新采购的服务器,因为在本机windows7环境已经反复测试通过.本以为分分钟完成的事情,结果折腾了我2天.服务器系统:windows server 2008 r2 ...
- MVC下判断PC和移动端
MVC下的PC端和移动端,其实没区别,写法都一样,只是有两点才改变了它们 第一点:就是单击这个页面任何地方的时候判断是移动端还是客户端: 第二点:新建手机端区域Areas(简单来说:Areas就相当于 ...