AWT事件处理模型
- 格式:doc
- 大小:65.50 KB
- 文档页数:11
AWT-SWT-Swing大比较之一:模型设计与实现总的来说Swing/AWT和SWT在事件处理机制上是类似的,窗口组件的树状结构也是类似的。
图形用户界面系统在事件处理设计上有两大类,一类是单线程模型,一类是多线程模型。
在事件处理机制上,三者都是遵循单线程规则。
单线程模型对于事件处理不保证线程安全性(Thread Safety),所有的事件处理都在Event Dispatch Thread(EDT)上进行,此一类事件模型通常叫做单线程模型。
这种模型规定所有对组件的访问操作必须在EDT上完成。
为什么对于组件的访问需要在EDT上完成?这主要是为了保证对于组件状态的改变是同步的,保证了界面组件的可确定性。
这中模型是大部分图形用户界面工具采用的模型,包括Swing/AWT、SWT、GTK、WinForm等等。
这种模型的好处是,结构设计和代码实现都比较简单,避免了为了实现线程同步的复杂处理。
但是也带来了一些问题,最常见的问题是,程序员容易将长时间复杂任务的处理放在事件处理函数完成,造成EDT线程被阻塞,给用户造成界面失去响应的错觉。
其实人们对于Swing速度慢和反映迟钝的感觉大部分来源于此,简单的说,是程序员的问题,而不是Swing自身的问题,是因为程序员没有理解这种事件处理机制造成的。
其实在SWT、GTK、WinForm等任何以这种事件模型为基础的工具都会出现。
重现的方法就是你简单的将长时间处理的任务放在事件处理函数中,你的用户界面就会失去响应。
如何解决这种问题?通用的办法就是采用异步线程处理长时间任务。
但是还要记住的是,在这种任务中对于界面的更新要采用SwingUtilities.invokeLater或者在SWT采用Synchroniz e方法,将访问操作放到EDT上进行。
关于如何写一个有效处理长时间任务的Swing程序,将会在其他文章中描述。
多线程模型中,所有的事件处理都是在异步线程中进行,界面组件同步访问的操作需要程序员来保证。
事件驱动程序设计图形用户界面是静态的,它应该能够响应用户的操作。
比如,当用户在GUI上输入一个字符或点击鼠标,都会发生事件,程序根据事件类型作出反应就是事件处理。
1.1 事件处理模型与事件类在Java 1.1版之前事件处理采用事件传递模型,这种方法有一定的缺点,因此从Java 1.1版开始,Java的事件处理采用了新的事件处理模型,我们称为事件代理模型(event delegation model)。
尽管在Java 2中仍然支持两种模型,但推荐使用新的事件模型。
所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器(listener)的对象,事件由事件监听器处理。
事件代理模型把事件的处理委托给外部实体进行处理,实现了事件源和监听器分离的机制。
事件代理模型涉及到三种对象:事件源、事件和事件监听器。
①事件源(event source):产生事件的对象,一般来说可以是组件,如按钮、对话框等。
当这些对象的状态改变时,就会产生事件。
事件源可以是可视化组件,也可以是计时器等不可视的对象。
②事件(event):描述事件源状态改变的对象。
如按钮被点击,就会产生ActionEvent 动作事件。
③事件监听器(listener):接收事件并对其进行处理的对象。
事件监听器对象必须是实现了相应接口的类的对象。
Java的事件处理模型如图1所示。
首先在事件源上注册事件监听器,当用户行为触发一个事件时,运行时系统寻找事件监听器对象来处理事件。
图 1 Swing事件处理模型为了实现事件处理,Java定义了大量的事件类,这些类封装了事件对象。
Swing组件可产生多种事件,如点击按钮、选择菜单项会产生动作事件(ActionEvent),关闭窗口会产生窗口事件(WindowEvent)等。
所有事件类的根类是java.util.EventObject类,该类的定义为:package java.util;public class EventObject implements java.io.Serializable {protected transient Object source;public EventObject(Object source) {if (source == null)throw new IllegalArgumentException("null source");this.source = source;}public Object getSource() {return source;}294public String toString() {return getClass().getName() + "[source=" + source + "]";}}其中,getSource()方法是最重要的方法,它返回触发事件的事件源对象,注意它的返回类型是Object。
Java AWT事件处理1 AWT事件处理基本概念AWT事件处理的过程中,主要涉及3类对象。
(1) Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent。
其实例在改事件发生时有系统自动产生。
(2) Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮Button。
(3) Event Monitor(事件监听器):接收事件对象并对其进行处理的类的对象,通常其中某个成员方法对事件进行相应的处理。
事件委托处理模型图10-10 事件委托处理模型Java采取了事件委托处理模型(Delegation Model),事件源自己不处理事件,而是把在其自身所有可能发生的事件委托给事件监听器来处理。
比如,在Canvas对象上既可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以委托给事件监听器1来处理鼠标事件,同时委托给事件监听器2来处理键盘事件。
委托模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。
2 事件事件分类。
按事件的性质分类java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。
AWT的相关事件继承于java.awt.AWTEvent类,这些AWT事件分为两大类:低级事件和高级事件。
(1)低级事件低级事件是指基于组件和容器的事件,当一个组件上发生事件,如鼠标的进入、点击、拖放等,或组件的窗口开关等时,触发了组件事件。
—ComponentEvent(组件事件:组件尺寸的变化、移动);—ContainerEvent(容器事件:组件增加、移动);—WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化);—FocusEvent(焦点事件:焦点的获得和丢失);—KeyEvent(键盘事件:键按下、释放);—MouseEvent(鼠标事件:鼠标单击、移动)。
java 事件处理模型当用户在Java GUI界面进行一些操作时,例如,移动鼠标、选取菜单项目等,将会引发相关事件(Event)。
在Java中,事件用具体的对象来表示,用户的相关动作会由JVM(Java虚拟机)创建成相应的事件对象,用以描述事件来源、事件类型以及相关的信息。
1.事件处理流程Java对事件的处理采用授权事件模型,也称为委托事件模型(Delegation Even t Model)。
在这个模型下,每个组件都有相应的事件,如按钮具有单击事件,文本域具有内容改变事件等。
当对于某个组件的事件被触发后,组件就会将事件发送给组件上注册的每一个事件监听器(EventListener),事件监听器中定义了与不同事件相对应的事件处理者,此时事件监听器会根据不同的事件信息调用不同的事件处理者,完成对这次事件的处理。
只有向组件注册的事件监听器才会收到事件信息。
此种模型的显著特点是,当组件被触发事件后,本身不去处理,而将处理的操作交给第三方来完成。
例如,当用户在GUI界面单击了一个按钮信息,此时按钮就是一个事件源对象,按钮本身没有权利对这次单击做出反应,需要做的就是将信息发送给本身注册的监听器(事件处理者)来处理。
在现实生活中,授权处理的实例也是非常的多。
打个不太恰当的比喻,比如说有一位李先生,李先生可能会发生很多法律纠纷,可能是民事法律纠纷,也可能是刑事法律纠纷,那么李先生可以请律师,他可以授权王律师负责帮他打民事法律的官司,同时也可以授权张律师帮他打刑事法律的官司。
这个请律师的过程从李先生的角度来看,就是授权的过程,而从王律师和张律师的角度来看,一旦被授权,他们就得时刻对李先生负责,时刻“监听”李先生的事件信息,一旦发生民事纠纷了,王律师就要马上去处理,而一旦发生刑事纠纷了,张律师就要马上进行处理。
此时此刻,李先生就是事件源,王律师是一个事件处理者,张律师是另外一个事件处理者,民事纠纷和刑事纠纷就是不同类型的事件。
《Java程序设计》模拟练习一一.选择题(每题2分,共20分)1、编译Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为(b )。
A. .javaB. .classC. .htmlD. .exe2、设x = 1 , y = 2 , z = 3,则表达式y+=z--/++x 的值是( a )。
A. 3B. 3. 5C. 4D. 53、下列哪种方法在Applet生命周期中只执行一次(a )A.init B.startC.stop D.run4、类Cycle的main()方法为:public static void main(String args[]){(args[0]);}则运行时如果命令行语句为java Cycle one two three,则输出结果为(b)A CycleB oneC twoD three5、下面哪一个是Thread类中的静态方法( d)A.start() B . stop()C . run()D . sleep(long m)6、关于下列语句哪个答案是正确的(a )A 不能编译成功B 可以编译成功,输出trueC 可以编译成功,但无输出D 以上均不对7、声明公用的abstract方法的正确格式是( c)A public abstract void add() {}B public abstract add();C public abstract void add();D public virtual add();8、下列程序结果正确的是(b )public class Test {public static void main (String args []) {Ad a1=new Ad();Ad a2=new Ad();}}class Ad{static int total = 10;public int add(int i){total=total+i;return total;}}A 11,12B 11,13C 11,11D 12,129、基于的一个程序中包含一个Panel,Panel其中包含一个Label,在Frame和Panel中分别有下面的一些语句://Frame里面的语句setFont( new Font(" Serif", Font. ITALIC, 18 );setBackground( Color. cyan );//Panel中的语句setBackground( Color. white );setForeground( Color. magenta );请问Label用什么颜色和字体显示(a)A. Background = white; foreground = magenta; font = Serif Italic style, 18 pointB. Background = cyan; foreground = black; font = Serif Italic style,18 pointC. Background = cyan; foreground = black; font = system default style for labelsD. Background = white; foreground = magenta; font = system default style for labels10、语句for(int x=0,y=0;(y!=0)&&(x<4);x++)的执行次数是( b )A 无限次B 一次也不执行C 执行4次D 执行3次二.简答题(每题4分,共20分)1. 对比分析Java与其它高级语言的编译和运行过程,说明Java具有平台独立性的原因?2.简述创建线程体的两种方式3.说明对象的基本概念和主要特征4.什么是JDBC5.方法重写和方法重载的特征分别是什么?举例说明三.判断题(每题1分,共10分)1.Java中的的字符使用的是16 位的Unicode 编码。
事件模型名词解释
事件模型是指一种设计模式,用于实现对象之间的通信。
它涉及三个主要对象:事件源、事件对象和事件监听器。
1.事件源:指发出事件的主体。
2.事件对象:指发出的事件本身。
3.事件监听器:提供处理事件指定的方法。
在Java AWT事件模型中,也称为授权事件模型,事件和监听器之间可以事先建立一种约定(授权),约定哪些事件该如何处理,由谁去进行处理。
这种约定称为授权。
一个事件源可以授权多个监听者(授权也称为监听者的注册);多个事件源也可以注册多个事件监听器。
监听者对于事件源发出的相应的事件作出响应。
所谓事件就是指发送给GUI系统的消息,该消息通知GUI系统某种事情已经发生,要求作出响应。
事件根据来源可分为以下几种:1.计算机输入输出设备产生的中断事件,如鼠标和键盘同GUI系统的交互操作。
这种事件是最原生的“底层”事件,一般都需要组件做深入处理,籍此触发更高抽象层次具有语义的逻辑事件。
为GUI系统扩展自定义组件往往需要编写处理这些事件,派发高级逻辑事件。
Swing中这些事件对应的有MouseEvent、KeyEvent等。
2.GUI系统触发的逻辑事件。
这种事件是1中所提的原始事件经过组件的处理后发出的高级事件,比如Swing的JButton产生的ActionEvent。
另外通知界面重绘的Paint事件也是高级逻辑事件,这种事件在接收到EXPOSE事件或系统显式调用repaint方法后触发的事件。
3.应用程序触发的事件。
应用程序主动触发新事件可以有两种方式来进行,第一种是事件通过添加到系统事件队列进行派发。
Swing中通过postEvent、repaint及invokeLater等方法,向系统事件队列添加事件。
这种触发机制实质上是调度,触发事件的线程和事件派发线程可以不是同一个线程。
事件被添加到系统事件队列后触发过程结束,而之后事件的处理要在事件派发线程上等待执行。
第二种是通过调用组件的派发方法(Swing中是fireEventXXXX)触发。
使用这种方法,事件对象不会被放到系统事件队列中去,而是直接传递给事件处理方法处理。
它的触发机制实质上是函数调用。
这种事件触发方式要求事件处理线程必须同时是事件派发线程。
GUI系统的事件模型根据事件处理线程和事件派发线程的关系可分为两种,一种是单线程模型,另一种是多线程模型。
单线程模型是指事件的处理线程和派发线程是同一线程。
事件从事件队列中取出之后,立即在当前线程中处理,处理完后才取下一个事件继续循环。
多线程模型是指事件派发线程只负责从事件队列中获取事件。
Java形界面SwingJavaFX和AWT Java形界面Swing、JavaFX和AWTJava是一种广泛应用的编程语言,其强大的图形界面(GUI)库使得开发者能够创建各种各样的用户界面。
在Java中,有三种主要的GUI库,它们分别是Swing、JavaFX和AWT。
本文将详细介绍这三种GUI库的特性和使用方法。
一、SwingSwing是Java提供的一套用于构建图形界面的库,它基于AWT库进行了扩展。
Swing提供了丰富的组件和布局管理器,使得开发者能够轻松地创建漂亮和交互性强的界面。
1.1 组件Swing提供了大量的组件,包括按钮、文本框、标签、列表框、表格等。
开发者可以通过组合这些组件来构建复杂的界面。
Swing组件的特点是可定制性高,开发者可以自定义组件的外观和行为。
1.2 布局管理器Swing通过布局管理器来自动调整组件的位置和大小。
常用的布局管理器有FlowLayout、BorderLayout、GridLayout和GridBagLayout。
开发者可以根据界面的需要选择合适的布局管理器。
1.3 事件处理Swing使用事件模型来处理用户的输入和其他操作。
开发者可以为组件添加事件监听器,响应用户的操作。
事件处理是Swing应用中的重要部分,可以使界面与用户产生交互。
二、JavaFXJavaFX是Oracle推出的新一代Java GUI库。
与Swing相比,JavaFX提供了更多的现代化特性,包括动画效果、3D支持和富文本等。
2.1 UI控件JavaFX提供了一套丰富的UI控件,包括按钮、标签、文本框、下拉框等。
这些控件样式多样,并且支持CSS样式表进行自定义。
2.2 布局JavaFX使用场景图(Scene Graph)来组织界面元素。
开发者可以使用各种布局容器来构建界面,如VBox、HBox、BorderPane等。
2.3 动画效果JavaFX内置了强大的动画框架,开发者可以轻松地创建平滑的过渡效果、缩放动画和旋转动画等。
《JAVA 程序设计基础》课程标准一、课程概述本门课程是为计算机科学专业的软件工程方向、软件服务外包方向、网络技术方向,以及通信工程专业的通信工程方向、嵌入式系统方向开设的一门专业基础课。
其主要内容有Java 基本语法、Java 基本语句、面向对象程序设计、多线程技术、异常处理机制、Windows 环境编程、Java 网络编程等等,其目标是为大学本科高年级学生提供有关Java 的基础知识以及面向对象的程序设计方法所必需具有的知识和技能;Java 语言的运行环境有许多特性,对图形用户界面(GUIs)、多线程和网络的支持,是当今应用最广的一门网络语言。
本门课程是计算机科学技术与通讯技术类专业的应用学科,本门课程的先修课程是《数据结构》,后续课程有《Java Swing 图形界面设计》、《JAVA 模式设计》。
该课程可以在大学二年级开设。
二、课程目标完成本课程的学习后,学生应该能够:1.了解Java 语言的主要特性,并理解面向对象的编程技术;2.掌握Java 语言的运行环境和Java 的基本语句及编程;3.理解并学会使用异常处理机制和多媒体技术;4.掌握图形用户界面设计和事件处理机制;5.学会开发多线程Java 应用程序和Java applets 小应用程序;6.理解TCP/IP和用户数据报协议(UDP),并掌握Java 网络编程和数据库编程。
三、课程内容与教学要求这门学科的知识与技能要求分为知道、理解、掌握、学会四个层次。
这四个层次的一般涵义表述如下:知道——是指对本门课程的教学内容和教学标准的认知。
理解——是指对本门课程涉及到的概念、原理与技术能明白和解释。
掌握——是指能运用已理解的知识进行编程。
学会——是指能灵活运用相关知识进行实验分析与设计。
教学内容和要求表中的“√”号表示教学知识和技能的教学要求层次。
本标准中打“*”号的内容可作为自学,教师可根据实际情况确定要求或不布置要求。
教学内容及教学要求表四、课程实施JAVA 语言程序设计是计算机科学技术以及通讯技术类选修课;一般情况下,每周安排3 课时,共54 课时,其中讲授 40 课时、实验 14 课时。