1、图形用户界面设计,Java的图形用户界面,2,主要内容,Java的GUI简介自定义图形设计 图形、文字、图象Java的标准组件 容器和组件 GUI的布局事件处理,Java的图形用户界面,3,图形用户界面(GUI),字符界面 用字符串、命令行的方式与用户交互 图形用户界面:Graphics User Interface 用直观的图形来表示数据 用直观、方便的GUI标准组件来接收命令 GUI组成成分的标准化 使用图形的方式借助菜单、按钮等标准界面元素和鼠 标操作,来帮助用户方便地向计算机系统发出命令, 启动操作,并将系统运行的结果同样以图形的方式显 示给用户。,Java的图形用户界面,4,用户界面
2、设计原则,控制权在用户 界面与操作的风格一致性 宽容(容错)性 简洁与美观并重,Java的图形用户界面,5,图形用户界面简介,图形用户界面的构成 容器:布局、安排 标准组件 用户自定义成分 设计&实现图形用户界面的工作 创建GUI各组成成分,并安排从属位置关系,根据具体需要对其进行排序,构成完整外观。 定义GUI各成分对不同事件的响应,实现与用户的交互功能。,Java的图形用户界面,6,界面构成,容器,用户自定义成分,容器是用来组织其他界面成分和元素的单元。一般一个图形用户界面对应一个复杂容器。如一窗口 标准组件是图形用户界面的最小单位,它里面不再包含其他的成分。如单选按钮,文本框,菜单 用户
3、自定义成分是指编程人员根据用户需要设计一些用户自定义的图形界面成分。如绘制几何图形,标准 组件,Java的图形用户界面,7,界面元素,容器是用来组织其他界面成分和元素的单元。 可以形成容器的层次,构筑复杂结构 Window(Frame、Applet、Dialog ) 组件是图形用户界面的基本单位,它里面不再包含其他的成分。 GUI组件是图形用户界面标准化的结果。常用的组件有:选择类的: 单选按钮、复选按钮、下拉列表; 文字处理类的: 文本框、文本区域命令类的: 按钮、菜单等 GUI组件的作用是完成与用户的交互。包括接收用户的命令、文本或选择输入,向用户显示一段文本或一个图形等。,Java的图形
4、用户界面,8,界面元素,使用组件通常需要如下的步骤 创建某组件类的对象,指定其大小等属性。 使用某种布局策略,将该组件对象加入到某个容器中的某指定位置处。 将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件的处理方法,实现利用该组件对象与用户交互的功能。 用户自定义成分 显示文字、绘制图形、显示图象 不能像标准组件一样被系统识别和承认,只起装饰作用。 不能响应用户的动作,不具有交互功能。,Java的图形用户界面,9,图形用户界面(GUI),Java的图形用户界面编程: 为方便图形用户界面的开发,设计了专门的类库 来生成各种标准图形界面元素和处理图形界面的 各种事件,这个用来生成图形界
5、面的类库就是java.awt包。AWT是abstract window toolkit抽象窗 口工具集的缩写。 AWT类库中的各种操作被定义在一个窗口中进行,开发人员用AWT开发出的图形用户界面可以适用于所有的平台系统。,Java的图形用户界面,10,AWT包,Abstract Window Toolkit(抽象窗口工具集) 提供各种构成GUI的标准构件。 AWT类库中的各种操作被定义在一个窗口中进行的。 抽取不同软硬件平台中所实现的窗口的公共特性。 依赖于具体平台系统实现:显示效果可能不同。 提供与机器无关的基本GUI标准组件 选择类组件:单选按钮、复选框、下拉选单、列表框 文字处理类组件:
6、标签、文本框、编辑框。 命令类组件:按钮、工具栏、菜单等。,Java的图形用户界面,11,从一个简单窗口开始,创建GUI应用程序 Frame必不可少它是带标题的顶层窗口,是构建应用程序图形界面的基础,它为应用程序实现人机交互提供了对话窗口 先来建一个空的窗口应用: Empty.java 注意:一定要处理关闭窗口的事件,Java的图形用户界面,12,import java.awt.*; /must import to use GUI /must extends Frame in an application public class Empty extends Frame/ 暂时采用1.0.2的
7、事件处理方法,关闭窗口public boolean handleEvent(Event evt)/根据Event类中参数evt的id值来判断发生事件的种类if(evt.id= =Event.WINDOW_DESTROY) System.exit(0);/ return的返回值表示将余下的事件处理交给handleEvent( )的父 / 类处理,从而保证对事件的正常处理return super.handleEvent(evt);public static void main(String args)Frame f=new Empty();f.setSize(300,200);f.setVisib
8、le(true); ,Java的图形用户界面,13,绘制用户自定义成分,用户自定义成分属于构成GUI的非标准部分 无法响应用户事件 一般仅仅起背景装饰、输出效果突出的作用 Java中的用户自定义成分 显示文字 绘制图形 显示图片,Java的图形用户界面,14,绘制用户自定义成分,一般在容器中(窗口)或画布上绘制。 利用Java.awt类库中的类及其方法绘制用户自定义的图形界面成分。 Graphics类包含很多绘制图形和文字的方法 。 首先要获得Graphics类的实例,然后利用其方法绘制。 Graphics类的实例一般作为相关方法的参数传递进来:paint(Graphics g) Java程序
9、图形界面的坐标设置,Java的图形用户界面,15,绘制图形及其相关方法,drawLine(x1,y1,x2,y2) /直线 drawRect(x,y,w,h) /矩形 drawOval(x,y,w,h) /圆或椭圆 fillOval(x,y,w,h) /实心圆或椭圆 drawPolygon(X坐标数组,Y坐标数组,顶点个数)/画多边形 drawArc (x,y,w,h,开始角度,弧度角度) setColor(Color c) /设置颜色 setFont(Font f) /设置字体 getColor() getFont(),Java的图形用户界面,16,绘制图形及其相关方法,从(x1,y1)到(
10、x2,y2)画直线 drawLine(x1,y1,x2,y2) 参数均为int 画弧线drawArc(x,y,w,h,) 参数均为int x,y为绘制弧形的左上角的坐标; w,h为弧形的宽度和高度;为弧形的起始角,为弧形的弧度, 为正,表顺时针方向; 为负,表逆时针方向。 以(x,y)为左上角、w为宽度、h为高度画矩形 drawRect(x,y,w,h) 参数均为int fillRect(x,y,w,h)、clearRect(x,y,w,h),Java的图形用户界面,17,绘制图形及其相关方法,画圆或椭圆 drawOval(x,y,w,h) x,y为绘制圆或椭圆的左上角的坐标,w,h确定了 椭
11、圆的宽度和高度 画实心圆或椭圆 fillOval(x,y,w,h) 画多边形 drawPolygon(X坐标数组,Y坐标数组,顶点个数)P.185,Java的图形用户界面,18,绘制图形及其相关方法,例子: sanmao.java,Java的图形用户界面,19,/画头部,椭圆方法drawOval g.setColor(Color.black); /setColor用来设置要使用的颜色 g.drawOval(40,40,120,150);. /画头发,直线方法drawLine,画弧方法drawArc g.drawLine(100,10,100,60); g.drawArc(110,20,100,
12、80,90,90);. /画嘴巴,填充画弧方法fillArc g.fillArc(60,130,80,40,180,180);. /画耳朵,填充椭圆方法fillOval,复制图形方法copyArea g.fillOval(25,92,15,30); g.copyArea(25,92,15,30,136,0); /拷贝某区域的图形至另一区域. /画身体,多边形方法fillPolygon g.fillPolygon(polygon_x,polygon_y,polygon_pt_num);,Java的图形用户界面,20,显示文字,字体显示效果类:Font一个Font类的对象表示了一种字体显示效果,包
13、括字体类型、风格和字号。Font mf = new Font(String 字体,int 风格,int 字号); 字体:TimesRoman, Courier, Arial等 风格:三个常量 Font.PLAIN, Font.BOLD, Font.ITALIC 字号:字的大小(磅数) 设置当前使用的字体:setFont(Font fn) 获取当前使用的字体:getFont() 例:UseFonts.java,Java的图形用户界面,21,String FontName = “TimesRoman“,“Courier“,“Arial“; int FontStyle = Font.PLAIN, F
14、ont. BOLD, Font.ITALIC; String StyleName = “PLAIN“, “BOLD“, “ITALIC“ ;public void paint( Graphics g) for ( int i=0; i3; i+) for ( int j=0; j3; j+) /set a new font and draw a string with the new fontg.setFont(new Font(FontNamei, FontStylej, 12);g.drawString( “ABEXYZ “ + FontNamei + “ “ + StyleNamej,
15、10,20*(i*3+j+2); /end of paint,Java的图形用户界面,22,paint()与update(),某组件的paint()和 update()为系统自动调用的有关图 形绘制的方法,不可人为编程调用;但可编程重新 定义其操作内容 使用repaint()方法可以触发update()方法,Java的图形用户界面,23,显示图象,图形与图象,java支持gif和jpeg格式 保存二进制图象的java.awt.Image类 获取Image对象的方法 getImage(图象文件所在的URL) getImage(图象文件所在的URL,图象文件名) Applet类以及java.awt
16、.Toolkit中均有方法的定义 注意:在application中只能使用Toolkit,而在Applet中,两者均可使用,Java的图形用户界面,24,显示图象,在applet小程序中,可使用Applet类的getImage方法获得图象。Image ig = getImage() 而在application中就只能使用ToolKit类的getImage方法:Image ig = getToolkit().getImage(“文件名”); 然后用Graphics类的drawImage方法显示Image对象。,Java的图形用户界面,25,显示图象,显示图象的方法drawImage(Image
17、对象, x, y,背景色, ImageObserver); java.awt.Graphics类中定义了此方法 第一个参数是保存图像数据的Image对象。 第二、三个参数是图像的左上角坐标,它们决定了图像在容器中的显示位置。 ImageObserver为一个接口,java的组件类实现了此接口,此处可理解为观察/显示Image对象容器,编程时一般可使用this,用于提示图象是否加载完成,Java的图形用户界面,26,显示图象,表示颜色的类Color显示的字符串或图形的颜色可以用Color类的对象来控制,每个Color 对象代表一种颜色,用户可以直接使用Color类中定义好的颜色常量,也可以通过调
18、配红、绿、蓝三色的比例创建自己的Color对象 Color(red,green,blue)来创建非缺省色 调用Graphics对象的setColor()方法可把当前的缺省颜色改成新建的颜色 Color blueColor=new Color(0,0,255);g.setColor(blueColor); P.189,Java的图形用户界面,27,Color类,构造方法1(设置颜色)Color c = new Color(int red, int green, int blue) 范围 :0255new Color(200,200,200)new Color(255,0,100) 构造方法2Co
19、lor c = new Color(float red, float green, float blue) 范围 :0.0 1.0 Color类定义了13种颜色常量值Color.black, Color.blue, Color.gray, Color.red . 对GUI的组件有四种与颜色相关的方法来设置和获取其背景色和前景色: setBackground(Color c); getBackground(); setForeground(); getForeground();,Java的图形用户界面,28,例:DrawMyImage.java public class DrawMyImage
20、extends Frame /获得Toolkit实例的方法getDefaultToolkit()Toolkit toolkit=Toolkit.getDefaultToolkit();Image myImage ;public DrawMyImage() /获得Image对象, 图象文件在当前目录下时myImage = toolkit.getImage(“Invntory.gif“);/在paint方法中绘制图象public void paint(Graphics g) g.drawImage(myImage, 0, 40, Color.orange, this ); ,Java的图形用户界面
21、,29,GUI标准组件概述,构建程序的图形用户界面的主要任务有两个 创建各界面组件并排列成图形用户界面的外观 定义这些组件对不同事件的影响从而完成图形用户界面功能 组成图形用户界面的成分有三类 用户自定义类 容器: 是能够容纳并排列其他组件的对象 组件: 放置在容器中的对象 在Java中,容器和组件是由AWT包中的对象来代表, 这些对象间的层次关系如下图:,Java的图形用户界面,30,AWT类层次关系图,Java的图形用户界面,31,GUI标准组件概述,基本组件被安放在容器中的某位置,用来完成一种具体的与用户交互的功能,使用基本组件一般包括如下的步骤 创建某种基本组件类的新对象,指定该对象的
22、属性比如:外观、大小等 将该组件对象加入到某个容器的合适位置 创建该组件对象的监听者,即实现以该组件为事件源的事件对应的监听者接口,也可以使现有的类实现该接口成为监听者。将该组件对象注册给此监听者,并在监听者内部实现监听者接口中定义的方法,对该组件可能引发的事件加以处理,定义新加入组件对象的交互性界面功能。比如:接收用户输入的文本、在屏幕显示输出等,Java的图形用户界面,32,GUI标准组件,Component:所有组件和容器的抽象父类 显示功能:paint(), update(), repaint() 显示效果控制:字体、颜色、位置、尺寸 图象处理:一般利用Canvas和Container
23、来显示图像 事件处理机制(java 1.1): addXXXListener( ) removeXXXListener( ),Java的图形用户界面,33,Component类,可显示在屏幕上的图形对象,可与用户交互。 是所有组件和容器的抽象父类,其中定义了一些每个容器和组件都可能用到的方法。 add(PopupMenu popup) 在组件上加入一弹出菜单 addFocusListener(FocusListener l)将发生在本组件上的事件注册给监听者,以进行事件处理。 setSize(int width, int height) 设置组件尺寸 repaint(int x,int y,i
24、nt width, int height) 重画组件 setFont(Font f) 设置组件字体 setBackground(Color c) 设置组件背景色 setVisible(boolean b) 设置组件是否可见,Java的图形用户界面,34,GUI标准组件,简单构件:人机交互的基本工具(控制) Button,Checkbox, Label等 TextComponent(TextArea,TextField) Canvas 复杂构件: Container(安放排列其他构件的容器) Panel Window,Java的图形用户界面,35,Container(容器),排列其中包容的构件
25、定位布局策略 set/getLayout() 包容其他基本构件 增加构件: add( ) 删除构件: remove( ) 控制是否显示容器及其中组件 setVisible(true/false),Java的图形用户界面,36,Container容器组件,Window 无边框、菜单的空白窗口。不需要其他组件支撑, 独立显示。 Frame: 用于Application,含边框、标题和菜单的独立窗口 Dialog: 依赖于 Frame的非独立窗口。没有菜单条,不能改变大小。 Panel (面板)属于无边框容器。必须放在Window组件中(或Web浏览器窗口)才能显示。它为一矩形区域,在其中可摆放其他
26、组件,可以有自己的布局管理器。 无边框容器包括Panel和Applet。其中Applet为Panel的子类 基本方法 add(Component comp) 将指定组件放到容器中 getComponent(int index) 获取指定序号的组件 remove(Component comp) 删除指定组件 setLayout(LayoutManager mgr) 设置容器布局,Java的图形用户界面,37,容器的组件布局,布局管理器(layout manager) 用于控制组件在容器中的布局 负责确定组件在容器中的位置和大小。 调用容器的setLayout(布局管理器对象) 方法,为容器指定某
27、种布局。 当容器需要定位组件和确定组件大小时,就会给布局管理器对象发消息,让它完成该项工作。 直接管理组件 调用容器的 setLayout(null) 方法,关闭布局管理器。 调用每一个组件的setLocation()方法决定组件位置。 调用每一个组件的setSize()方法决定其大小。,Java的图形用户界面,38,布局管理器种类,在Java的GUI界面设计中,布局控制是通过为容器设置布 局编辑器来实现的。Java.awt包中共定义了五种布局编辑 类,每一个布局编辑类对应一种布局策略: FlowLayout :组件在一行中按加入的先后顺序从左至右水平排列, 排满后折行,每行中的组件都居中排列
28、。 BorderLayout:把容器空间划分为北、南、西、东、中五个区,每加入一个组件都应说明把这个组件加在那个区 域中。 CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片中的某一个 GridLayout:以行和列的网格形式安排组件 GridBagLayout:更复杂、功能更强的网格布局,Java的图形用户界面,39,确定容器布局,缺省的布局管理器 Window、Frame、Dialog BorderLayout: 缺省的窗口容器的管理器 Panel、Applet FlowLayout: 缺省的Panel布局管理器 选择布局管理器的方法 建立布局管理器类的对象 利用容器的 se
29、tLayout 为容器指定布局(即指定一个布局管理器的对象),Java的图形用户界面,40,确定容器布局,改变缺省布局管理器的方法; 例:BorderLayout B=new BorderLayout();C1.setLayout(B); orC1.setLayout(new BorderLayout();例: 将myFrame布局设定为FlowLayout类型myFrame.setLayout(new FlowLayout();,Java的图形用户界面,41,Frame,Frame(String title) 构造一个新的不可见的frame 隐含的布局管理器是:BorderLayout se
30、tLayout() 设置新的布局管理器。 add(Component comp) 在容器上增加一个组件(在容器为不可见的状态时加)。 void setSize(int width, int height) 设置组件大小 setVisible(true) 设置组件可见,Java的图形用户界面,42,Frame Panel,Frame fm1 = new Frame(“Hello“);fm1.setSize(400,350);fm1.setBackground(Color.gray);fm1.setLayout(null);Panel pn1 = new Panel();pn1.setSize(1
31、00,100);pn1.setBackground(Color.red);pn1.setLocation(0,50);fm1.add(pn1);fm1.setVisible(true);,Java的图形用户界面,43,FlowLayout布局管理器,构造方法: FlowLayout() ; FlowLayout(int align, int hgap, int vgap); align :对齐方式:LEFT CENTER RIGHT hgap :组件水平间距 (象素) vgap :组件垂直间距 无参数的构造方法创建的FlowLayout对象,其对齐方式为CENTER居中方式,组件间的横纵间距都
32、为5个像素。,Java的图形用户界面,44,FlowLayout布局管理器,Frame f = new Frame(“FlowLayout“);f.setSize(400,300); /不起作用f.setBackground(Color.gray);f.setLayout(new FlowLayout(FlowLayout.LEFT,10,20);b1 = new Button(“button1“);b2 = new Button(“button2“);b3 = new Button(“button3“);f.add(b1);f.add(b2);f.add(b3);f.setVisible(t
33、rue);f.pack(); /询问布局管理器窗体大小,Java的图形用户界面,45,BorderLayout布局管理器,setLayout(new BorderLayout() ) add(b1,BorderLayout.NORTH); 当容器大小改变,组件相对位置不会改变。,Java的图形用户界面,46,BorderLayout布局管理器,f = new Frame(“BorderLayout“);f.setSize(200,200);b1 = new Button(“button1“);b5 = new Button(“button5“);f.add(b1,BorderLayout.NO
34、RTH);f.add(b2,BorderLayout.SOUTH);f.add(b3,BorderLayout.WEST);f.add(b4,BorderLayout.EAST);f.add(b5,BorderLayout.CENTER);f.setVisible(true);,Java的图形用户界面,47,Border-Panel,class MyFrame extends FrameMyFrame()Button b1 = new Button(“ 1 “);Button b2 = new Button(“ 2 “);Button b3 = new Button(“ 3 “);Button
35、 b4 = new Button(“ 4 “);Panel p = new Panel();p.add(b1);p.add(b2);add(p,BorderLayout.NORTH);add(b3,BorderLayout.WEST);add(b4,BorderLayout.CENTER);pack();setVisible(true); ,Java的图形用户界面,48,GridLayout布局管理器,创建GridLayout对象作为布局编辑器,指定划分网格的行数和列数(网格大小一样)。setLayout(new GridLayout(行数, 列数);setLayout(new GridLay
36、out(行数, 列数,行间隔,列间隔); 调用容器的方法add()将组件加入容器,组件填入容器的顺序将按照第一行第一个、第一行第二个、 每个网格中都必须填入组件,如果希望某个网格为空白,可以为它加入一个空的标签:add (new Label();,Java的图形用户界面,49,GridLayout布局管理器,f = new Frame(“GridLayout“);f.setLayout(new GridLayout(2,3);f.setSize(200,100);f.setBackground(Color.gray);b1 = new Button(“1“);b6 = new Button(“
37、6“);f.add(b1);f.setVisible(true);,Java的图形用户界面,50,布局例,Frame fm = new Frame()fm.setLayout(new FlowLayout();tf = new TextField(22);fm.add(tf);Panel p1 = new Panel();p1.setLayout(new GridLayout(4,3);p1.add();Panel p2 = new Panel();p2.setLayout(new GridLayout(4,3);p2.add();fm. add(p1); fm. add(p2);,Java的
38、图形用户界面,51,GridBagLayout布局管理器,每个GridBagLayout对象维护一个动态矩形网格, 每个组件可占据一个或多个单元作为它的显示区域。 每一个组件都与一个GridBagConstraints类的实例相连,以指定在显示区域中如何摆放,并可确定大小。 步骤: setLayout(new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; (属性赋值) add(button1 , gbc ),Java的图形用户界面,52,GridBagLayout布局管理器,
39、设置GridBagConstraints类实例属性值: gridx gridy 组件显示区域的左上角单元格坐标 gridwidth gridheight 指定显示区域行、列单元数 RELATIVE 紧挨着前一个组件摆放 fill 当显示区域大于组件时如何扩充组件: HORIZONTAL 水平充满 VERTICAL 垂直充满 BOTH 全部填充 NONE 不调整(隐含) ipadx ipady 指定组件间最小间隔 anchor 当显示区域大于组件时如何摆放组件(对齐方式) CENTER(隐含), NORTH, EAST, SOUTH, WEST, SOUTHEAST, NORTHEAST, SO
40、UTHWEST, NORTHWEST.,Java的图形用户界面,53,CardLayout布局管理器,使用CardLayout的容器表面可以容纳多个组件,将每一个组件视为一张卡片,同一时刻只能显示一个组件。 setLayout(new CardLayout() CardLayout方法(按序指定组件) first(Container parent) 显示第一个版面的内容 last(Container parent) 显示最后一个版面的内容 previous(Container parent) 显示前一个版面的内容 next(Container parent) 显示下一个版面的内容 CardLa
41、yout方法(按名显示组件) addLayoutComponent(String name, Component c) show(Container parent, String name),Java的图形用户界面,54,利用AWT创建自己的GUI,GUI外观设计 设计标准构件层次关系:构件层次结构关系树 设置容器布局策略:setLayout() 生成标准构件 向容器中添加组成构件:add()方法 构件事件处理 例:AWTComponent.java,Java的图形用户界面,55,public class AWTComponent extends Frame . . .public AWTCo
42、mponent() setSize(450,300); /设置Frame大小setLayout(new FlowLayout(); /设置布局. . . /创建组件Group1 = new CheckboxGroup(); /创建单选按钮组radioButton1 = new Checkbox(“male“, Group1, false);add(radioButton1); /把组件加入容器radioButton2 = new Checkbox(“female“, Group1, false);add(radioButton2);. . .setVisible(true); /显示容器及组件
43、. . . ,还缺什么吗?,Java的图形用户界面,56,Java1.0.2的事件处理,使用单一的java.awt.Event类来接受所有类型的事件; 使用action(), handleEvent( )以及其他的一些事件处理方法(如鼠标事件、键盘事件、焦点事件)来进行相应事件的事件处理。 缺点:造成长if分支语句组,不利于面向对象的编程,Java的图形用户界面,57,Java1.1 对事件处理的改进,引入java.awt.event包 更加面向对象,易于理解 定义了事件的“发生者”和“监听者”对象按钮事件、文本事件、选择事件、调整事件、鼠标事件、键盘事件等 事件以类层次来表达,取代了1.0.
44、2中的单一的类,并可以自定义事件类型,Java的图形用户界面,58,事件及处理机制,用户操作GUI组件时会引发各种事件。 事件 :描述“发生了什么事情”的对象。 系统根据用户的操作构造出相应事件类的对象。 事件源:事件的产生地。 事件处理程序:是一个方法,它接收一个事件对象、 分析它、并完成对该事件的处理。 每个事件有一个相应的监听者接口,它规定了能够接收(并处理)该类事件的方法的规范。 监听者:实现了监听者接口的类,它包含有事件处理程序。 编程人员要为事件源指定监听者对象(即指定处理某种事件的事件处理程序)。,Java的图形用户界面,59,事件处理机制,组件(事件发生者)触发一个相应类型的事
45、件 此事件由相应类型的Listener(事件监听者)接收并处理,Java的图形用户界面,60,事件及处理机制,调用按扭的 addActionListener ( )方法,为该按扭指定监听者。,Java的图形用户界面,61,几个有用的概念,事件 在java.awt.event包中定义了若干类型的事件类 监听者接口 特定类型的Listener接口,用于监听特定类型的事件 监听者类 是实现了某种监听者接口的类,由编程者定义 事件监听者 是某个监听者类的对象,由编程者使用new创建,Java的图形用户界面,62,实现步骤,根据需要定义相应类型的监听者类,在类的定义中完成事件的处理(建议使用inner
46、class定义); 创建事件监听者对象; 为将会触发事件的组件C注册相应的事件监听者对象(使用C的addXXXListener()方法)。 例:ButtonAct.java,Java的图形用户界面,63,public class ButtonAct extends Frame . . .public ButtonAct() . . . /为b1注册事件监听者B1b1.addActionListener(new B1();add(b1);. . . /利用inner class结构定义监听者类class B1 implements ActionListener /利用actionPerforme
47、d方法进行事件处理public void actionPerformed(ActionEvent e)who.setText(“Button 1“);. . . /:,Java的图形用户界面,64,事件与监听者类型,XXXListener接口与XXXEvent XXX为特定类型 常用类型:Action, Focus, Key, Window, MouseEvent vs. Mouse/MouseMotionListener 注册与取消:组件包含的新方法addXXXListener()与removeXXXListener() 参考:eventtables.html,Java的图形用户界面,65,
48、监听者接口中有什么?,每种Listener接口均定义了一套abstract方法,编程者必须在监听者类中实现这些方法来做事 件处理; 例: ActionListener: actionPerformed() WindowListener: windowOpened/Closing/Closed/Activated/Deactivated/Iconified/Deiconified(),Java的图形用户界面,66,使用Listener Adapter,由于接口中的方法为abstract方法,所以在监听者类中要实现所有的方法,较为烦琐。 为了简化编程,引入了Adapter。具有两个以上方法的监听者
49、接口均对应一个XXXAdapter类,提供了接口中每个方法的缺省实现。,Java的图形用户界面,67,使用Listener Adapter(续),例: class MyWindowListener extends WindowAdapter public void windowClosing(WindowEvent e) System.exit(0); 例:DoubleClick.java(相应鼠标事件),Java的图形用户界面,68,public class DoubleClick extends Frame Vector m_vLocs; /保存鼠标单击过的各点, 用以绘制各点连线Point m_CursorLoc; /跟踪当前鼠标位置, 用以绘制十字光标public DoubleClick() m_vLocs = new Vector();m_CursorLoc = new Point(100,100);setSize(400, 400);/为Frame注册3个事件监听者addMouseListener(new click();addMouseMotionListener(new move();addWindowListener(new wd();public void paint(Graphics g) /绘制十字光标, 连接各点 ,