SWT_GUI设计的入门了解.ppt_第1页
SWT_GUI设计的入门了解.ppt_第2页
SWT_GUI设计的入门了解.ppt_第3页
SWT_GUI设计的入门了解.ppt_第4页
SWT_GUI设计的入门了解.ppt_第5页
已阅读5页,还剩172页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要内容,基于java程序的gui设计工具,主要包括下述几个概念: 组件-component(api) 容器-container 布局管理器-layoutmanager 事件处理,主要内容,容器及布局管理:解决组件在容器中的位置和大小; 常用组件介绍:按钮、文本框、标签、列表框、菜单等; 事件管理:如何监听和响应事件;,主要内容,在java中,开发一个gui程序,通常需要以下几步: (1)构建一个顶层容器,通常是jframe或japplet; (2)构建若干个组件,组件可以是其它容器; (3)设定容器的布局管理器,用容器的add()方法将这些组件加入到这个容器中; (4)设置组件事件,并将组件事件与代码关联。,重点掌握的内容,从介绍容器及布局管理入手,主要掌握组件如何布置问题,重点掌握取消布局管理的方法 事件管理,是本章的核心,对事件管理的四个要素,各起什么作用?怎样应用熟练掌握? 对事件处理的三个方式要清楚,至少掌握一种方法 对各组件的具体使用,重点是按钮、文本框、标签,其它了解 对菜单、鼠标、键盘的事件管理做了解,7.1 图形用户界面概述,图形用户界面gui(graphics user interface) 1、目的 在applet或application程序中提供人机交互界面,是不可缺少的部分。 2、有关的java包及类 java.awt包,抽象窗口工具包awt,是jdk1.0 版本,主要包括如下: 绘制图形、控制字体和颜色; 容器及布局管理; 各种常用组件,如按钮、文本框、列表框等; 菜单,对话框; 事件管理; javax.swing包,是对awt的升级和扩充,比awt 组件更丰富、功能更强,由jdk1.2以上版本提供,兼容awt,各组件名前加j字头,如jbutton。,为了开发gui程序,在java 1.2版之前, java提供了一个awt类库,称为抽象窗口工具箱(简称awt) 。 由于awt存在严重缺陷,sun从java 1.2 版开始提供了一个新的组件库swing。 swing可以说是第二代gui开发工具集,它是通过javax.swing包提供的,javax.swing包也是java基础类库的组成部分。,7.1 图形用户界面概述,由于swing组件比awt组件有许多优点,所以新开发的程序应该使用swing组件而不应该再使用awt组件。 swing组件并没有完全取代awt,它只是替代了awt包中的图形用户界面组件(如button、textfield、textarea等),awt中的一些辅助类(如graphics、color、font、layoutmanager等)仍然保持不变。另外,swing仍然使用awt的事件模型。,7.1 图形用户界面概述,swing组件简介,1. 组件及层次 在java语言中,与图形用户界面相关的包有多个,其中比较重要的有java.awt包、java.awt.event包、javax.swing包。 图7.1给出了有关包中常用的类及类的层次结构。,1. 组件及层次,图7.1中applet类在java.applet包中,以j开头的类在 javax.swing包中,其他类在java.awt包中。,图7.1 java gui所用类的层次结构图,表7-1 构建图形用户界面常用的类,java把component类的子类或间接子类创建的对象称为一个组件。 把container的子类或间接子类创建的对象称为一个容器。 awt中的大部分类都是容器类(container)和组件类(component)的子类或间接子类。,1. 组件及层次,java.awt包中一部分类的层次关系如图所示,1. 组件及层次,2.组件分类,容器组件:容器组件又可以分为三类: 顶层容器:包括jframe、japplet、jdialog; 通用容器:包括jpanel、jscrollpane、jsplitpane、jtabbedpane、jtoolbar; 专用容器:包括jinternalframe、jlayeredpane、jrootpane等。 基本组件:基本组件包括jbutton、jtextfield、 jcombobox、jlist、jmenu、jslider等。这些组件有的主要用于信息的显示,如jlabel、jprogressbar、jtooltip等,有的可以在其中编辑信息,如jtextarea、jtextfield、jfilechooser、jcolorchooser、jtable、jtree等。 菜单组件:菜单组件包括jmenubar、jmenu、jmenuitem、jradiobuttonmenuitem、jcheckboxmenuitem和jpopupmenu等。这些组件主要用于构建各种菜单。,2.组件分类,japplet:java.lang.applet的扩展版本。 jbutton: 按钮或命令按钮。 jcheckbox: 复选框。 jcheckboxmenuitem: 复选菜单项。 jcombobox: 组合框。 jcomponent: swing组件的基类。 jdialog: 对话框窗口的基类。 jlabel: 标签项。 jlist: 列表框。 jmenu: 菜单。 jmenubar: 菜单条。 jmenuitem: 菜单项。 jpanel: 通用的轻量容器。 jpasswordfield: 文本框(用来输入口令),jcomponent类常用方法,jcomponent抽象类是所有swing组件的超类,其 中定义了每个组件都可以使用的方法,常用的方法 有: public void setsize(int width,int height) 设置组件或容器的大小。 public void setvisible(boolean b) 设置组件或容器是否可见。 public void setbackground(color c) 设置组件的背景颜色,color为颜色类。 public color getbackground() 返回组件的背景颜色,color为颜色类。,jcomponent类及其方法,public void setforeground(color c) 设置组件的前景颜色。 public color getforeground() 返回组件的前景颜色。 public void setfont(font f) 设置组件上使用的字体,font为字体类。 public font getfont() 返回组件上使用的字体。 public graphics getgraphics() 返回组件的图形上下文(graphics context)或绘图对象,graphics为图形上下文类,使用该类对象可以在组件上绘制图形。 public void settooltiptext(string text) 设置组件上的提示信息。 public string gettooltiptext() 返回组件上的提示信息。,container类及其方法,容器(container)也是一个类,实际上 是component的子类,因此容器本身也是一 个组件,具有组件的所有性质,但是它的主 要功能是容纳其他组件和容器。,添加到容器中的组件位置和大小由容器的布局管理器决定(layout manager)。setlayout()方法设置容器布局。 容器中可以容纳其他组件,通过调用容器的add()方法把其他组件添加到容器中。,container类及其方法,container类中的常用方法: public component add(component comp) public component add(component comp, int index) 向容器中添加组件,index参数指定组件添加到容器中的位置,无index参数则添加到默认位置。 public void remove(component comp) 从容器中清除指定的组件。,container类及其方法,public void setlayout(layoutmanager mgr) 设置容器的布局。参数mgr是布局管理器对象,它决定组件在容器中如何摆放。 public void paint(graphics g) 在容器上绘制图形。 public void paintcomponents(graphics g) 在容器上绘制图形。 public void update(graphics g) 更新容器上绘制的图形。,7.2 容器(container),容器的作用:容纳其它组件; 容器类:container类,继承于component类; 基本容器:共有三种; 1、japplet:java小程序容器,可作为顶层容器,除菜单以外,可加入任何其它组件。 2、jframe:框架容器,生成弹出式窗口,可加入菜单和任何组件,是独立于japplet的顶层容器,可在applet和application中使用。 3、jdialog:对话框容器,也是一种弹出式窗口,作为顶层容器,可加入其它组件,但不能加入菜单,用于弹出一些信息。java提供一些标准的对话框,如filedialog可推出window风格的文件对话框,对文件进行打开、保存等。 一般容器:有jpanel,jscrollpanel,jtabbedpanel,jtoolbar等。,简单的框架窗口,1. 创建简单的框架窗口 每个使用swing gui的程序必须至少有一个顶层swing容器。 对于gui应用程序来说,一般应该有一个主窗口,也称为框架窗口。在swing中,框架窗口是由jframe对象实现的。 2.jframe类常用的构造方法有: public jframe() 创建一个没有标题的窗口对象。 public jframe(string title) 创建一个以title为标题的窗口对象。,3.常用方法 (1)创建窗口 直接创建一个jframe的实例或通过继承jframe类来定义 子类,再创建对象。 例: jframe frame=new jframe(“窗体“); (2)设置标题 通过super(string title)调用基类的构造方法,或通过 settitle(string title)方法设置标题。 jframe frame=new jframe(“窗体“); 或jframe frame=new jframe(); frame.settitle(“窗体”); (3)设置初始位置 void setlocation(int x,int y)设置初始位置,其中x,y是窗口左上角在屏幕上的坐标值。 (4)设置大小 void setsize(int w,int h) 设置frame尺寸。,简单的框架窗口,(5)设置窗体是否可见 void setvisible(boolean b)设置窗体是否可见。 (6)窗体自适应组件 void pack()调整frame大小自动适应显示所有组件。 (7)定义关闭行为 setdefaultcloseoperation(int operation)方法设置关闭行 为。其中operation取值如下: exit_on_close:当关闭窗口时退出程序。 do_nothing_on_close:当关闭窗口时不做任何处理。 hide_on_close:当关闭窗口时隐藏这个窗口。(默认) dispose_on_close:当关闭窗口时隐藏并处理这个窗口。,简单的框架窗口,程序7.1 helloswing.java,import javax.swing.*; public class helloswing public static void main(string args) jframe frame = new jframe(“hello swing“); frame.setsize(400,240); frame.setvisible(true); frame.setdefaultcloseoperation( jframe.exit_on_close); ,程序7.1 helloswing.java,图7-3 最简单的框架窗口,继承jframe类,程序7.1的方法在创建比较简单的窗口时还可以,如果窗口比较复杂,就会使得main()方法的内容过多。 一般应该创建一个继承jframe类的子类,然后编写程序创建该类对象。,程序7.2 helloswing.java,import javax.swing.*; public class helloswing extends jframe public helloswing1() this(“ helloswing “); public helloswing(string title) super(title); setsize(400,250); setlocation(350,250); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) helloswing frame = new helloswing(); ,在框架中添加组件,若向顶层容器(jframe、japplet、jdialog)中添加组件,可以使用容器的add()方法实现。 必须清楚容器使用的布局管理器,否则可能会得不到需要的结果。,程序7.3 simpleframe.java,import java.awt.*; import javax.swing.*; public class simpleframe extends jframe jbutton jbutton1,jbutton2; public simpleframe(string title) super(title); jbutton1 = new jbutton(“ok“); jbutton2 = new jbutton(“cancel“); setlayout(new flowlayout(); add(jbutton1); add(jbutton2); setsize(400,300); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) simpleframe frame = new simpleframe(“frame with button“); ,在框架中添加组件,实际上jframe对象是由多个窗格组成的,如图7.6所示。,在框架中添加组件,jframe对象的中间层是内容窗格(content pane),它是一个容器对象。 用容器的add()方法添加的组件实际是添加到该内容窗格中的。 每个容器都有一个布局管理器,它管理着组件在其中的大小、位置等。 内容窗格默认的布局管理器是borderlayout, 即边界式布局。 可以使用容器的setlayout()方法改变容器的布局管理器。,7.3 容器布局,1 borderlayout布局管理器 2 flowlayout布局管理器 3 gridlayout布局管理器 4 其他布局管理器 5 面板容器及容器的嵌套 6 应用程序外观,java语言的一个特点是强调程序的平台无关性。对于图形用户界面同样是这样。 在java的图形界面程序中,它是通过为每种容器提供了布局管理器来实现组件布局的。 所谓布局管理器就是为容器设置一个layoutmanager对象(即布局管理器对象),来管理组件在容器中摆放的顺序、位置、大小以及当窗口大小改变后组件如何变化等特征。,7.3 容器布局,通过使用布局管理器机制就可以实现gui的跨平台性,同时避免为每个组件设置绝对位置。 常用的布局管理器有: flowlayout borderlayout gridlayout cardlayout和gridbaglayout 这些类都是在java.awt包中定义的。,7.3 容器布局,每种容器都有默认的布局管理器,也可以为容器指定新的布局管理器。 如果要将某个容器的布局管理器设置为新的布局,需要使用构造方法创建一个布局管理器对象,然后使用容器的setlayout()方法将容器设置为这种布局管理器。,7.3 容器布局,borderlayout:边界式布局。是swing包中 容器jframe、japplet、jdialog的默认布 局管理器。 布局特点:将容器分为东西南北中五个区域,通常每个区域放一个组件,位置及大小无法控制; 构造方法:有两个 public borderlayout() public borderlayout(int h_gap,int v_gap),1. borderlayout布局管理器,borderlayout的构造方法,public borderlayout(int hgap, int vgap) 该构造方法创建一个布局管理器对象,hgap和vgap分别指定使用这种布局时组件之间的水平间隔和垂直间隔距离,单位为像素。 public borderlayout() 该构造方法创建一个borderlayout布局管理器对象,使用这种布局时组件之间没有间隔。,borderlayout布局管理器,borderlayout布局也叫边界式布局,它将容器分成东、南、西、北、中五个区域,每个区域可放置一个组件或其他容器。北占据容器的上方,东占据容器的右侧,等等。中间区域是在东、南、西、北都填满后剩下的区域。 若要改变容器的布局管理器须调用容器的setlayout()方法,它的格式为: public void setlayout(layoutmanager layout),borderlayout布局管理器,使用borderlayout 布局管理器,当窗口的大小改变时,容器中的组件大小相应改变。当窗口垂直延伸时,东、西、中区域也延伸;而当窗口水平延伸时,南、北、中区域也延伸。 当某个区域没有添加组件时,中央组件会占据无组件的空间,但若没有中央组件,四周组件都有,中央区域空出,请读者自己修改程序,去掉某个区域的组件,观察程序运行效果。,borderlayout布局管理器,向borderlayout布局的容器中添加组件应该使用add(component c, int index)方法,c为添加的组件,index为指定的位置。 指定位置需要使用borderlayout类定义的五个常量: borderlayout.north borderlayout.south borderlayout.east borderlayout.west borderlayout.center 如果不指定位置,组件添加到中央位置。 见bordlayouttest.java,程序7.4 borderlayoutdemo.java,import java.awt.*; import javax.swing.*; public class borderlayoutdemo extends jframe jbutton jbutton1,jbutton2, jbutton3,jbutton4,jbutton5; public borderlayoutdemo(string title) jbutton1 = new jbutton(“北“); jbutton2 = new jbutton(“南“); jbutton3 = new jbutton(“西“); jbutton4 = new jbutton(“东“); jbutton5 = new jbutton(“中“); / 设置布局管理器 setlayout(new borderlayout(10,10);,add(jbutton1, borderlayout.north); add(jbutton2, borderlayout.south); add(jbutton3, borderlayout.west); add(jbutton4, borderlayout.east); add(jbutton5, borderlayout.center); setsize(300,240); settitle(title); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) borderlayoutdemo window = new borderlayoutdemo(“border demo“); ,程序运行结果如图所示:,图7-6 边界式布局,flowlayout;流式布局,是applet和frame和jpanel 的默认布局。 布局特点:组件按加入的先后顺序依次从左至右,从上至下排列,位置及大小无法控制; 构造方法:有三个 public flowlayout(); public flowlayout(int alignment); 对齐方式:flowlayout.left 左对齐 flowlayout.center 中间对齐 flowlayout.left 右对齐 public flowlayout(int alignment,int h_gap,int v_gap); h_gap 水平间隙;v_gap垂直间隙。,2. flowlayout布局管理器,flowlayout布局管理器,flowlayout布局也叫流式布局,它是最简单的布局管理器。是applet、frame和jpanel的默认布局。 设置为这种布局管理器的容器,当向其中添加组件时组件是从左到右,从上到下,一个一个地放置到容器中,一行放不下,放到下一行。 采用这种布局管理器的容器,当调整窗口大小后,布局管理器会重新调整组件的摆放位置,组件的大小和相对位置不变,组件的大小采用最佳尺寸。,flowlayout类常用的构造方法,public flowlayout(int align, int hgap, int vgap) 指定添加到容器中组件的对齐方式(align)、水平间距(hgap)和垂直间距(vgap)。 对齐方式align的取值必须为flowlayout定义的整型常量之一: flowlayout.left:表示左对齐 flowlayout.right:右对齐 flowlayout.center:居中对齐 水平间距是指水平方向上两个组件之间的距离,单位是像素。 垂直间距是行之间的距离,单位也是像素。,flowlayout类常用的构造方法,public flowlayout(int align) 该构造方法只指定对齐方式。组件之间的水平间距和垂直间距使用默认值5个像素。 public flowlayout() 使用该构造方法构造的对象,对齐和间距都采用默认值:居中对齐,水平间距和垂直间距是5个像素。,程序7.5 flowlayoutdemo.java,import java.awt.*; import javax.swing.*; public class flowlayoutdemo extends jframe public flowlayoutdemo() flowlayout layout = new flowlayout(flowlayout.center,10,20); setlayout(layout); add(new jbutton(“button 1“); add(new jbutton(“2“); add(new jbutton(“button 3“); add(new jbutton(“long-named button 4“); add(new jbutton(“button 5“);,settitle(“flowlayout demo“); / 设置窗口标题 setsize(380,150); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) flowlayoutdemo window = new flowlayoutdemo(); ,程序的运行结果如图所示:,图7-7 流式布局的应用,3. gridlayout布局管理器,也叫网格式布局,将容器分成大小相等的单元格,每个单元格可放置一个组件,每个组件占据单元格的整个空间,调整容器的大小,单元格大小随之改变。,gridlayout类的构造方法,public gridlayout(int rows, int cols, int hgap, int vgap) 参数rows和cols分别指定网格布局的行数和列数 hgap和vgap指定组件的水平间隔和垂直间隔,单位为像素。 行和列参数至少有一个为非0值。 public gridlayout(int rows, int cols) 缺省组件之间的间隔,组件之间间隔为0像素。 public gridlayout() 创建只有一行的网格布局对象,每个组件占一列,所有组件在一行,组件之间间隔为0像素。,gridlayout类的构造方法,如果指定的行数和列数与添加的组件个数不一致时 当行数、列数都不为零,以行优先 若有一个为零,则以非零值优先 例: cp.setlayout(new gridlayout(3,1,10,20); 如果添加的组件多于3个,结果是3行多列。 cp.setlayout(new gridlayout(3,0,10,20); 如果添加的组件多于3个,结果是3行多列。 cp.setlayout(new gridlayout(0,3,10,20); 如果添加的组件多于3个,结果是多行3列。,gridlayout布局管理器,向网格布局的容器中添加组件,只需调用容器的add()方法即可,不用指定位置,系统按照先行后列的次序依次将组件添加到容器中。,程序7.6 gridlayoutdemo.java import java.awt.*; import javax.swing.*; public class gridlayoutdemo extends jframe public gridlayoutdemo() setlayout(new gridlayout(0,2); add(new jbutton(“button 1“); add(new jbutton(“2“);,程序7.6 gridlayoutdemo.java,add(new jbutton(“button 3“); add(new jbutton(“long-named button 4“); add(new jbutton(“button 5“); settitle(“gridlayout demo“); pack(); / 以紧缩的形式显示组件 setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) gridlayoutdemo window = new gridlayoutdemo (); ,gridlayout布局管理器,程序的运行结果如图所示:,图9-8 网格布局的应用,4. 其他布局管理器,除上面介绍的布局管理器外,java语言还提供了若干布局管理器,例如: cardlayout、gridbaglayout、boxlayout、grouplayout和springlayout等。 每种布局管理器都有自己的特点,应用在特殊的场合。其中有些非常复杂,可应用于较复杂的图形用户界面的设计中。 如果界面复杂,可以考虑使用集成开发环境(ide)来设计用户界面。,其他布局管理器,在设计图形界面时,java也支持组件绝对定位的设计。 如果需要手工控制组件在容器中的大小和位置,应该将容器的布局管理器设置为null,即调用容器的setlayout()方法,并将参数指定为null,然后调用组件的setlocation()方法设置组件在容器中的位置、调用setsize()或setbounds()方法设置组件的大小。 不推荐使用这种方法。,5.取消布局管理器及布置组件的方法,取消布局管理器的目的:不受布局管理器固定格式的限制,使组件可任意大小,摆放在任何位置,增加使用的灵活性。 取消的方法:容器的对象名.setlayout(null); 布置组件的方法: 设置组件对象摆放位置及大小的方法: 组件对象名.setbounds(new rectangle(x,y,w,h); 或setbounds(x,y,w,h); 再把组件对象添加到容器中: 容器对象名.add(组件对象名) 演示例程:见layoutnull.java,6. 面板容器及容器的嵌套,jpanel类:由于某一种布局管理器的能力有限,在设计复杂布局时通常采用容器嵌套的方式,即把组件添加到一个中间容器中,再把中间容器作为组件添加到另一个容器中,从而实现复杂的布局。 jpanel类对象经常在构造复杂布局中作为中间容器,既可以把它放入其他容器中,也可以在其上放置其他容器和组件,但它不能单独显示,需要放到jframe或applet这样的顶层容器中。 jframe、japplet、jdialog都默认有一个jpanel。,jpanel的构造方法,public jpanel(layoutmanager layout) 创建一个面板对象,使用指定的布局管理器对象layout设置面板的布局。 public jpanel() 使用缺省的布局管理器创建一个面板。 面板的缺省的布局管理器是flowlayout。也可以在创建面板对象后重新设置它的布局,方法也是使用面板对象的setlayout()方法。,jpanel的常用方法,常用方法: void setsize(int w,int h) void setvisible(boolean b) void setlayout(layoutmanager l);进行布局管理,面板容器及容器的嵌套,使用面板容器作为中间容器构建图形用户界面程序的一般思想是: 先将组件添加到面板上,然后将面板作为一个组件再添加到顶层容器中。 例:设计一个如图所示的图形界面,程序7.7 framewithpanel.java,import java.awt.*; import javax.swing.*; public class framewithpanel extends jframe jpanel panel_1,panel_2; public framewithpanel() super(“frame with panel“); panel_1 = new jpanel(); / 设置面板的背景颜色为青色 panel_1.setbackground(color.cyan);,创建两个jpanel对象,在一个jpanel对象上放置三个按钮,再将此jpanel对象添加到框架内容窗格的南部,将另一个jpanel对象添加到窗口的中央即可。,panel_2 = new jpanel(); panel_2.setlayout( new flowlayout(flowlayout.center,20,10); panel_2.add(new jbutton(“red“); panel_2.add(new jbutton(“green“); panel_2.add(new jbutton(“blue“); add(panel_1,borderlayout.center); add(panel_2,borderlayout.south); setsize(300,200); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string args) framewithpanel frame = new framewithpanel (); ,图 jcomponent及其子类的层次结构,7.4 常用组件简介,7.4 常用组件简介,1、frame(jframe) 窗体容器 向frame中添加组件,可直接向frame对象添加 this.add(new button(“确定”); 向jframe对象中添加组件,要先获取contentpane对象,然后再使用add()方法把组件添加到contentpane。 conteiner c=getcontentpane(); c.add(new jbutton(“退出”);,7.4 常用组件简介,2、jpanel(panel)面板容器,也称画布、白板。 3、按钮: 命令按钮:button(jbutton) 单选按钮:radiobutton( jradiobutton ) radiobuttongroup(按钮组) 复选框: checkbox 4、jlabel(lable)标签 主要用于显示字符串,输出一些信息及提示; 5、文本框 文本框即能输入又能输入字符串,而lable只能输出,有三种文本框: 单行文本框:textfield(jtextfield) 多行文本框:textarea(jtextarea) 口令框: passwordfield 演示例程:testalltext.java,7.4 常用组件简介,6、列表框,组合框 列表框:jlist(list),下拉式列出选项; 组合框:jcombobox(combbox),如同list,但最上面为可编辑区,可进行输入编辑,也可从下拉列表中选项到编辑区; 演示例程:list_combbox.java 7、其它组件 滚动条:slider; 表格:table; 树:tree; 滚动栏:scollbar; 滚动面板:scollpane; 标签面板:tabbedpane;,7.5 事件处理,现代的图形用户界面程序都是事件驱动的。 通过事件处理才能实现用户与程序的交互。 本节主要介绍java gui程序的事件处理模型:包括 监听器的事件处理模型; 和常见的事件处理方法。 还将介绍java gui编程中常用的组件,包括标签、按钮、文本框和菜单等,它们是图形用户界面程序中最基本的元素。,1 事件处理模型 2 事件类 3 事件监听器 4 事件处理的基本步骤 5 常见的事件处理 6 事件适配器类,7.5 事件处理,1. 事件处理模型,在java 1.1版之前事件处理采用事件传递模型。 从java 1.1版开始,java的事件处理采用了新的事件处理模型,称为事件代理模型。 所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器的对象,事件由事件监听器处理。事件代理模型把事件的处理委托给外部实体进行处理,实现了事件源和监听器分离的机制。,事件代理模型,涉及三种对象:事件源、事件和事件监听器。 事件源(event source):产生事件的对象,一般来说可以是组件,如按钮、对话框等。当这些对象的状态改变时,就会产生事件。事件源可以是可视化组件,也可以是计时器等不可视的对象。 事件(event):描述事件源状态改变的对象。如按钮被点击,就会产生actionevent动作事件。 事件监听器(listener):接收事件并对其进行处理的对象。事件监听器对象必须是实现了相应接口的类的对象。,java的事件代理模型,首先在事件源上注册事件监听器,当用户行为触发一个事件时,运行时系统将创建一个事件对象,然后寻找事件监听器对象来处理该事件。,图 gui事件处理模型,2. 事件类,为了实现事件处理,java定义了大量的事件类,这些类封装了事件对象。 swing组件可产生多种事件,如点击按钮、选择菜单项会产生动作事件(actionevent),关闭窗口会产生窗口事件(windowevent)等。 java.util.eventobject类是所有事件类的根类,该类的定义为:,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; public string tostring() return getclass().getname() + “source=“ + source + “; ,2. 事件类,java.awt.awtevent是eventobject类的子类,同时又是所有组件awt事件类的根类。 该类中定义了getid()方法,它返回事件的类型。 awtevent类的常用的子类定义在java.awt.event包中,其中常用的awt事件类如下图所示。,图 常用的awt事件类及层次关系,2. 事件类,表1 常用事件及产生事件的组件,3. 事件监听器,事件的处理必须由实现了相应的事件监听器接口的类对象处理。 java为每类事件定义了相应的接口。 事件类和接口都是在java.awt.event包中定义的。 表2列出了常用的事件监听器接口、接口中定义的方法以及所处理的事件。 接口中定义了一个或多个方法,这些方法都是抽象方法,必须由实现接口的类实现,java程序就是通过这些方法实现对事件的处理的。,表2 事件监听器接口、方法及处理的事件,表2 事件监听器接口、方法及处理的事件,4. 事件处理的基本步骤, 确定事件源和要处理的事件类型 就是确定要处理哪些组件的什么事件。 实现相应的监听器接口并创建监听器对象 实现监听器接口可有多种方法: 方法1:用内部类(推荐); 方法2:在定义的类中用implements实现; 方法3:用匿名内部类实现;,说明: 一个类可以实现一个接口,也可以实现多个接口。 实现监听器接口必须实现接口中定义的所有方法。实现接口中定义的方法就是编写事件处理的代码。 对于有多个方法的接口,系统还定义了事件适配器类,可以通过继承事件适配器类实现。,4. 事件处理的基本步骤, 为组件注册监听器 每种组件都定义了可以触发的事件类型,使用相应的方法为组件注册监听器。如果程序运行过程中,对某事件不需处理,也可以不注册监听器,甚至注册了监听器也可以注销。 /注册监听器 public void addxxxlistener(xxxlistener l) /注销监听器 public void removexxxlistener(xxxlistener l),4. 事件处理的基本步骤,说明: 处理事件必须注册监听器:只有为组件注册了监听器后,在程序运行时,当发生该事件时才能由监听器对象处理,否则即使发生了相应的事件,事件也不会被处理。 一个事件源 发生多种事件由多个事件监听器处理; 一个监听器对象处理多个事件源的同一类型的事件(如下述程序两个按钮可以用一个监听器对象处理。),4. 事件处理的基本步骤,例:简单的事件处理程序,例程序7.8 eventdemo.java,功能是:点击“ok”按钮时,在文本框中显示“你点击了ok按钮”,点击“cancel”按钮时,在文本框中显示“你点击了cancel按钮”。,图 简单的事件处理程序,方法1. 通过内部类实现监听器接口,程序7.8 eventdemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class eventdemo extends jframe jtextfield tf ; jbutton btn1,btn2; public eventdemo() super(“event demo“); tf = new jtextfield(15); btn1 = new jbutton(“ ok “); btn2 = new jbutton(“cancel“); setlayout(new flowlayout(); add(tf); add(btn1); add(btn2); al listener = new al(); /创建一个监听器对象 btn1.addactionlistener(listener); /为按钮注册监听器 btn2.addactionlistener(listener);,setsize(350,100); setlocation(200,200); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); class al implements actionlistener / 内部类 public void actionperformed(actionevent e) if(jbutton)e.getsource()=btn1) tf.settext(“你点击了ok按钮“); / 修改文本框的内容 else if(jbutton)e.getsource()=btn2) tf.settext(“你点击了cancel按钮“); public static void main(stringargs) eventdemo frame = new eventdemo(); ,方法1. 通过内部类实现监听器接口,方法2. 通过当前类实现监听器接口,改写上面的程序用当前类对象本身作为监听器对象,需要修改的主要代码如下:见eventdemo1.java public class eventdemo extends jframe implements actionlistener btn1.addactionlistener(this); /为按钮注册监听器 btn2.addactionlistener(this); public void actionpe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论