GUI事件处理 主讲:赖国荣 QQ:31343080 www.sms98.cn
回 顾 1、AWT简介 2、容器组件 3、布局管理器 4、常用组件 组件/容器/布局管理器 Frame Panel FlowLayout/GridLayout/BorderLayout 4、常用组件 Button/Label/TextField/List/Choice
目 标 1、AWT事件处理 2、AWT组件库
事件处理机制 事件授权处理机制:对组件注册事件监听,当有某个动作触发了这个该事件后,Java运行时系统将调用对应的方法响应该操作。 事件处理过程中涉及到三类对象: 1、Event-事件。每个事件都对应java中的一个 类。例如键盘操作对应的事件类是KeyEvent。 2、Event Source-事件源。事件发生的场所,通常就是各个组件,例如按钮Button 。 3、Event handler-事件处理者。接收事件对象并对其进行处理的对象。
事件处理机制 刑事事件 处理事件 两个律师“监听”他的不同行为 民事事件 他“授权”给不同的律师 处理不同的事件
事件处理机制 使用授权处理模型进行事件处理的一般方法归纳如下: 1、对于某种类型的事件XXXEvent, 定义相应的事件监听器类,该类需要实现与该事件相对应的接口XXXListener; 2、事件源实例化以后,必须进行授权,注册该类事件的监听器,使用addXXXListener(XXXListener ) 方法来注册监听器。
事件类 AWTEvent-5-1 1、与AWT有关的事件都是java.awt.AWTEvent类派生的。 2、AWT事件分为两大类 : 低级事件:基于组件和容器的事件。 如:鼠标的进入,点击,拖放等,或组件的窗口开关等。 高级事件:基于语义的事件,它不和特定的动作相关联,而依赖于触发此事件的类。 如:TextField中按Enter键会触发ActionEvent事件。滑动滚动条会触发AdjustmentEvent事件。选中项目列表的某一条就会触发ItemEvent事件。
事件类 AWTEvent-5-2 低级事件 高级事件(语义事件) ComponentEvent(组件事件:组件尺寸的变化,移动) ContainerEvent(容器事件:组件增加,移动) WindowEvent(窗口事件:关闭窗口,图标化) FocusEvent(焦点事件:焦点的获得和丢失) KeyEvent(键盘事件:键按下、释放) MouseEvent(鼠标事件:鼠标单击,移动) 高级事件(语义事件) ActionEvent(动作事件:按钮按下) AdjustmentEvent(调节事件:调节滚动条上数值) ItemEvent(项目事件:修改下拉列表中的选项) TextEvent(文本事件:文本对象改变)
事件类 AWTEvent-5-3 FocusEvent包含的事件: 1、FOCUS_FIRST 第一个获得焦点的对象标志符 2、FOCUS_GAINED 确定正获得焦点的组件标志符 3、FOCUS_LAST 最后一个获得焦点的对象标志符 4、FOCUS_LOST 确定失去焦点的组件标志符
事件类 AWTEvent-5-4 Mouse Event包含的事件: MouseMotion Event包含的事件: MOUSE_PRESSED 当鼠标按下时触发该事件 MOUSE_RELEASED 当鼠标释放时触发该事件 MOUSE_CLICKED 当点击鼠标时触发该事件 MOUSE_ENTERED 当鼠标进入指定区域时触发该事件 MOUSE_EXITED 当鼠标退出指定区域时触发该事件 MouseMotion Event包含的事件: MOUSE_MOVED 当鼠标的位置发生改变时触发该事件 MOUSE_DRAGGED 当鼠标按下且位置发生改变时触发该事件
事件类 AWTEvent-5-5 KeyEvent事件包含: KEY_PRESSED 当按下键盘中某个键时触发。 KEY_RELEASED 当释放键盘中按下的键时触发。 KEY_TYPED 确定按下的是那个键值,通常是一个字符,对应pressed事件。
事件监听器-6-1 监听器是接口,根据事件类中定义的动作来定义方法。 AWT中每类事件都有对应的事件监听器。 事件监听器的使用: 1、注册事件监听。 2、在对应的事件监听方法中实现处理操作。
事件监听器-6-2 KeyEvent相对应的接口KeyListener : public interface KeyListener extends EventListener { public void keyPressed(KeyEvent ev); public void keyReleased(KeyEvent ev); public void keyTyped(KeyEvent ev); }
事件监听器-6-3 Mouse Event对应的接口MouseListener public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e) ; public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e) ; public void mouseEntered(MouseEvent e) ; public void mouseExited(MouseEvent e) ; }
事件监听器-6-4 AWT的组件类中提供注册和注销监听器的方法: 注册监听器: public void add<ListenerType> (<ListenerType>listener); 如:button. addMouseListener(this); 注销监听器: remove<ListenerType> (<ListenerType>listener); 如:button..removeMouseListener(this);
事件监听器-6-5例子ThreeListener.java 例子:ThreeListener.java
事件监听器-6-6总结 1、在一个类中可以实现多个监听接口。 2、可以由同一个对象监听一个事件源上发生的多种事件 。 3、事件处理者和事件源处在同一个类中。 4、可以通过事件对象获得详细资料。
事件适配器Adapter –4-1 1、适配器(adapter)是实现XXXListener接口的抽象类。 3、但当需要多种监听器或该类已经有父类的时候,就不能通过适配器来实现事件监听。
事件适配器Adapter –4-2 java.awt.event包中定义的事件适配器类: 1.ComponentAdapter( 组件适配器) 2.ContainerAdapter( 容器适配器) 3.FocusAdapter( 焦点适配器) 4.KeyAdapter( 键盘适配器) 5.MouseAdapter( 鼠标适配器) 6.MouseMotionAdapter( 鼠标运动适配器) 7.WindowAdapter( 窗口适配器)
事件适配器Adapter –4-3 MouseAdapter鼠标事件适配器类 public abstract class MouseAdapter implements MouseListener { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
事件适配器Adapter –4-4例子
用内部类实现事件处理-3-1 内部类(inner class)是被定义于另一个类中的类。 使用内部类的主要原因是由于: 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 实现事件监听器时,采用内部类编程非常容易实现其功能。 编写事件驱动程序,内部类很方便。
用内部类实现事件处理-3-2简单内部类例子
用内部类实现事件处理-3-3例子
AWT组件库 –button-3-1 1、按钮(Button) 构造方法是: public Button() public Button(String label) 如: Button b1 = new Button(); Button okb = new Button(“OK”);
AWT组件库 –button-3-2 按钮事件: 1、按钮被点击后,会产生ActionEvent事件,需ActionListener接口进行监听和处理事件。 2、ActionEvent的对象调用getActionCommand()方法可以得到按钮的标识名,缺省按钮名为 labelN。 3、用setActionCommand()可以为按钮设置组件标识符。
AWT组件库 –button-3-3例子
AWT组件库 –Checkbox -4-1 2、复选框( Checkbox)提供简单的“on/off”开关,旁边显示文本标签。 构造函数: public Checkbox() public Checkbox(String label) public Checkbox(String label, boolean state) public Checkbox(String label, boolean state, CheckboxGroup group)
AWT组件库 –Checkbox -4-2 参数说明: 1、 checkbox的默认状态是“off” 。 3、可将多个checkbox放在一个checkboxgroup中当成一组。 4、第四、五两种构造器是一样的,只是 参数位子颠倒。
AWT组件库 –Checkbox -4-3 Checkbox监听事件 复选框用ItemListener 来监听ItemEvent事件 当复选框状态改变时用getStateChange()获取当前状态 使用getItem()获得被修改复选框的字符串对象
AWT组件库 –Checkbox -4-4例子
AWT组件库 –Choice-2-1 3、下拉式菜单(Choice)下拉式菜单每次只能选择其中的一项,它能够节省显示空间,适用于大量选项。 构造函数: public Choice() Choice 用ItemListener接口来进行监听
AWT组件库 –Choice-2-2
AWT组件库 –TextField-2-1 4、单行文本输入区(TextField) 构造函数 public TextField() 创建一个空字符的输入框 public TextField(String text) 用指定的字符串创建一个输入框 public TextField(int colu) 创建一个空的输入框,规定字符长度类似不超过 col指 定的数字。 public TextField(String text, int columns) 用指定的字符串创建一个输入框,规定字符长度 类似不超过 col指定的数字。
AWT组件库 –TextField-2-2 在输入框中按下回车键时,会发生ActionEvent事件,通过ActionListener中的actionPerformed()方法对事件进行相应处理。 setEditable(boolean)方法设置为只读属性。 例如: TextField tf1 = new TextField(); TextField tf2 = new TextField("", 20); TextField tf3 = new TextField("Hello!"); TextField tf4 = new TextField("Hello",30);
AWT组件库 –TextArea 5、文本输入区(TextArea) TextArea可以显示多行多列的文本 用setEditable(boolean)方法,可以设置为只读 可以显示水平或垂直的滚动条。
AWT组件库 –MenuBar & Menu 6、MenuBar只能被添加到Frame对象中,作为整个菜单树的根基。 调用frame的setMenuBar()为一个窗口添加一个菜单条。 Menu 菜单,它可以被添加到MenuBar中或其它Menu中。 MenuItem菜单树中的“叶子节点”,通常被添加到一个Menu中 。 MenuBar和Menu都没有必要注册监听器。 MenuItem通过ActionListener来实现事件监听。
AWT组件库 –MenuBar & Menu
AWT组件库 –其他组件 7、列表(List) 提供了多个文本选项,列表支持滚动 条,可以浏览多项。 8、框架(Frame)Frame是顶级窗口,可以显示标 题,重置大小。 9、对话框(Dialog)它是Window类的子类。对话 框和一般窗口的区别在于它依赖于其它窗口。 10、画布 (Canvas)提供一个空白的区域,可以让 用户继承后自定义组建。
补充资料 各个组件与他们对应的事件监听见 组件与监听器的对应关系图\listener.htm AWT中提供的事件类型以及对应的接口方法 事件类型及其接口和方法\event&interface.htm
总结 1、AWT中提供的两种事件监听处理方法 1、通过实现XXXListener接口 2、通过继承XXXAdapter类