910 likes | 1.14k Views
第 8 章 图形用户界面的设计与实现. 本章介绍 Java 基本的图形编程知识,包括窗口的显示、文字和图像的显示、事件处理以及图形用户界面中常用的组件等内容。 本章要点 8.1 Java 图形用户界面概述 8.2 标准组件 8.3 简单图形用户界面 8.4 Java 事件处理 8.5 布局管理 8.6 常用标准组件 8.7 Swing 组件 思考与练习 8. 8.1 Java 图形用户界面概述.
E N D
第8章 图形用户界面的设计与实现 本章介绍Java基本的图形编程知识,包括窗口的显示、文字和图像的显示、事件处理以及图形用户界面中常用的组件等内容。 本章要点 • 8.1 Java图形用户界面概述 • 8.2 标准组件 • 8.3 简单图形用户界面 • 8.4 Java事件处理 • 8.5 布局管理 • 8.6 常用标准组件 • 8.7 Swing组件 • 思考与练习8
8.1 Java图形用户界面概述 图形用户界面(Graphics User Interface),简称GUI。使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。 Java1.0中出现了用来生成图形用户界面的包是java.awt,简称抽象窗口工具集,即AWT(Abstract Window Toolkit)。它的设计目标是希望构建一个通用的GUI,使得利用它编写的程序能够运行在所有的平台上,以实现Sun公司提出的口号“一次编写,随处运行”。 在Java1.2中,Sun公司推出了新的用户界面库:Swing。相对AWT来说,Swing功能更强大、使用更方便,它的出现使得Java的图形用户界面上了一个台阶。 但是,Swing并没有代替AWT。在Java1.1中,AWT事件处理模型有了根本改变。Swing使用的仍然是Java1.1的事件处理模型。 java.awt包中提供了GUI设计所使用的类和接口,如图8-1中显示了到主要类之间的关系。
8.1 Java图形用户界面概述 图8-1 awt包中主要类之间的关系
8.1 Java图形用户界面概述 Java中设计和实现图形用户界面的工作主要有: 1.创建组件(Component):创建组成界面的各种元素,如按钮、文本框等。 2.指定布局(Layout):根据具体需要排列组件的位置关系。 3.响应事件(Event):定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。 Java中构成用户界面的各种元素和成分可以分为三类:容器、控制组件和用户自定义成分。 1.容器 容器是用来组织其他界面成份和元素的单元。一般说来,一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面成份和元素,这些界面元素本身又可以是一个容器,这个容器将再进一步包含它的界面成份和元素,依次类推就构成一个复杂的图形界面系统。
8.1 Java图形用户界面概述 容器的主要作用和特点有: (1)容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。 (2)容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。 (3)容器通常都有一个背景,这个背景覆盖全部容器,可以透明,也可以指定一幅特殊的图案,使界面生动化和个性化。 (4)容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。 (5)容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。 (6)容器可能被包含在其他容器之中。
8.1 Java图形用户界面概述 2.控制组件 与容器不同,控制组件是图形用户界面的最小单位之一,它里面不再包含其他的元素。控制组件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。从某种程度上来说,控制组件是图形用户界面标准化的结果。 3.用户自定义成分 除了标准的图形界面元素,编程人员还可以根据用户需要设计一些用户自定义的图形界面成份,例如绘制一些几何图形,使用标志图案等。用户自定义成份由于不能像标准界面元素一样被系统识别和承认,所以通常只能起到装饰、美化等作用,而不能响应用户的动作,不具有交互功能。
8.2 标准组件 8.2.1 组件分类 Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。 AWT组件分为容器(Container)类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮(Button)、标签(Label)、文本类组件(TextComponent)等。 java.awt包中的常用组件,如图8-2和图8-3所示。
8.2 标准组件 8.2.1 组件分类 图8-2 Component类的常用组件
8.2 标准组件 8.2.1 组件分类 图8-2 Component类的常用组件 图8-3 MenuComponent类的常用组件
8.2 标准组件 8.2.1 组件分类 图8-3 MenuComponent类的常用组件
8.2 标准组件 8.2.1 容器类组件 容器分为两种:顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,不需要其他组件支撑。顶层容器的类是Window,Window的重要子类是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。 非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等。Panel必须放在Window组件中才能显示,它为一矩形区域,在其中可摆放其他组件,可以有自己的布局管理器。 Panel的重要子类是Applet类。其中,Panel和Applet的容器都是无边框的;ScrollPane是可以自动处理滚动操作的容器。 容器类的特点是:容器中可以容纳其他组件,使用add()方法,可以将其他对象加入到容器中。加入到容器中后,组件的位置和尺寸由布局管理器决定。 常用的Container类的方法如下: 1.add(Component comp):将指定组件放到容器中 2.remove(Component comp):删除指定组件 3.setLayout(LayoutManager mgr): 设置容器布局
8.2 标准组件 8.2.2 容器类组件 容器分为两种:顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,不需要其他组件支撑。顶层容器的类是Window,Window的重要子类是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。 非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等。Panel必须放在Window组件中才能显示,它为一矩形区域,在其中可摆放其他组件,可以有自己的布局管理器。 Panel的重要子类是Applet类。其中,Panel和Applet的容器都是无边框的;ScrollPane是可以自动处理滚动操作的容器。 容器类的特点是:容器中可以容纳其他组件,使用add()方法,可将其他对象加入到容器中。加入到容器中后,组件的位置和尺寸由布局管理器决定。 常用的Container类的方法如下: 1.add(Component comp):将指定组件放到容器中 2.remove(Component comp):删除指定组件 3.setLayout(LayoutManager mgr): 设置容器布局
8.2 标准组件 • 8.2.3 控制组件 • 基本的控制组件是用来提供人机交互的基本控制界面,包括: • 按钮(Button) • 单选按钮(CheckboxGroup) • 复选框(Checkbox) • 下拉列表框(Choice) • 画板(Canvas) • 列表框(List) • 标签(Label) • 文本组件(Textfield和TextArea) • 滚动条(Scrollbar) • 菜单(Menu) • 等等
8.2 标准组件 8.2.3 控制组件 使用控制组件,通常需要如下步骤: 1.创建某控制组件类的对象,指定其大小等属性。 2.使用某种布局策略,将该控制组件对象加入到某个容器中的某个指定位置处。 3.将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件处理方法,实现利用该组件对象与用户交互的功能。
8.2 标准组件 8.2.4 Component类 类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括: public void add(PopupMenu popup):在组件上加入一个弹出菜单 public Color getBackground():获得组件的背景色 public Font getFont():获得组件使用的字体 public Color getForeground():获得组件的前景色 public Graphics getGraphics():获得在组件上绘图时需要使用的Graphics对象 public void repaint(int x,int y,int width,int height):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域 public void setBackground(Color c):设置组件的背景色 public void setEnabled(boolean b):设置组件的使能状态。参数b为true则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件 public void setFont(Font f):设置组件使用的字体 public void setSize(int width,int height):设置组件的大小 public void setVisible(boolean b):设置组件是否可见的属性。参数b为true时,组件在包括它的容器可见时也可见;否则组件不可见 public void setForeground(Color c):设置组件的前景色 public void requestFocus():使组件获得焦点
8.2 标准组件 8.2.4 Component类 类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括: public void add(PopupMenu popup):在组件上加入一个弹出菜单 public Color getBackground():获得组件的背景色 public Font getFont():获得组件使用的字体 public Color getForeground():获得组件的前景色 public Graphics getGraphics():获得在组件上绘图时需要使用的Graphics对象 public void repaint(int x,int y,int width,int height):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域
8.2 标准组件 8.2.4 Component类 public void setBackground(Color c):设置组件的背景色 public void setEnabled(boolean b):设置组件的使能状态。参数b为true则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件 public void setFont(Font f):设置组件使用的字体 public void setSize(int width,int height):设置组件的大小 public void setVisible(boolean b):设置组件是否可见的属性。参数b为true时,组件在包括它的容器可见时也可见;否则组件不可见 public void setForeground(Color c):设置组件的前景色 public void requestFocus():使组件获得焦点
8.3 简单图形用户界面 8.3.1 Frame与Panel 一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。 另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。
8.3 简单图形用户界面 8.3.1 Frame与Panel Frame类具有以下特点: Frame类是Window类的直接子类; Frame对象显示的效果是一个“窗口”,带有标题和尺寸; Frame默认初始化为不可见的,可使用setVisible(true)方法使之变为可见; 默认的布局管理器是BorderLayout,可使用setLayout()方法改变其默认布局管理器。 Frame的构造方法有: Frame f=new Frame(); Frame f=new Frame(String s); s为Frame的标题字符串。
8.3 简单图形用户界面 8.3.1 Frame与Panel 使用Frame窗口时将会用到的几个方法: 1.设置窗口大小 setSize()这个方法用来设置窗口的大小,如下所示: void setSize(int newWidth, int newHeight) void setSize(Dimension newSize) 窗口的新的大小在变量newWidth和newHeight中被指定,或者在来自Dimension类的newSize对象的width和height这两个成员变量中被指定。这些大小使用像素为单位。 2.获得当前的窗口大小 getSize()这个方法被用来获得当前的窗口大小,如下所示: Dimension getSize() 这个方法返回一个Dimension对象,在这个对象的成员变量width和height中存放着当前窗口的大小。
8.3 简单图形用户界面 8.3.1 Frame与Panel 3.隐藏和显示一个窗口 当一个frame窗口被创建以后,这个窗口默认是不可见的,除非你调用它的setVisible()方法。如下所示: void setVisible(boolean visibleFlag) 如果这个方法的参数是true,那么调用它的组件是可见的。否则,就被隐藏。 4.设置窗口标题 你可以通过使用setTitle()方法来改变一个frame窗口的标题。如下所示: void setTitle(String newTitle) 在这里,参数newtitle是窗口的新标题。
8.3 简单图形用户界面 8.3.1 Frame与Panel 5.关闭frame窗口 当使用一个frame窗口时,你的程序必须在它被关闭时通过调用setVisible(false)方法来将窗口从屏幕中除去。为了截获窗口关闭事件,你必须实现WindowListener监听器接口的windowClosing()方法。在windowClosing()方法中,你必须将窗口从屏幕中除去。在下一节中将讲解这种技术。
8.3 简单图形用户界面 8.3.1 Frame与Panel Panel类具有以下特点: Panel不是顶层窗口,它必须位于窗口或其他容器之内; Panel可以容纳其他组件,在程序中经常用于布局和定位; Panel默认的布局管理器是FlowLayout,可使用setLayout()方法改变其默认布局管理器; Panel可以采用和所在容器不同的布局管理器。
8.3 简单图形用户界面 8.3.2 字体设置 Java中用Font类来设置字体。一个Font类的对象表示了一种字体显示效果,包括字体类型、字型和字号。 Font类的构造方法如下: Font(String name,int style,int size); 其中,name代表字体名称,例如,可以是Helvetica、TimesRoman、Courier、宋体、楷体等。 style代表字体风格,有三种字体风格静态变量,即: Font.BOLD:黑体 Font.ITALIC:斜体 Font.PLAIN:正常字体
8.3 简单图形用户界面 8.3.2 字体设置 它们可以互相组合使用,例如:Font.BOLD+Font.ITALIC size代表字体大小,单位是point,一个point是1/72英寸。 例如: Font f = new Font("TimesRoman", Font.PLAIN, 14); 在组件中显示所用的字体可以用setFont()方法来设置。这个方法的参数应当是java.awt.Font类的实例。 例如,使用Graphics类的参数g: g.setFont(f); 设置按钮上的字体: Button btn =new Button(); Btn.setFont(f); 书中表8-1列出了Font类的主要方法。
8.3 简单图形用户界面 8.3.2 字体设置 另外,Java提供了几种文字的输出方法: 1.drawBytes(byte bytes[],int offset,int number,int x,int y): 字节输出方法 2.drawChars(char chars[],int offset,int number,int x,int y): 字符输出方法 3.drawString(String string,int x,int y): 字符串输出方法 其中,x、y代表输出字符的起始坐标位置,bytes[]是字节数组,chars[]是字符数组,string是字符串,offset是数组的起始下标,number是要绘制的元素个数。这三个方法都属于Graphics类,使用当前的颜色和字体来绘制字符。 其中,drawstring()是最常用的方法。 不同的系统中安装了不同的字体,为了得到本系统中所有已安装的字体,我们可以通过GraphicsEnvironment类的getAvailableFontFamilyNames方法来实现。该方法返回一个字符串数组,数组内包含所有可用的字体名。
8.3 简单图形用户界面 8.3.3 绘制简单图形 绘制图形和文字都要用到Graphics类。Graphics是java.awt包中的一个类,其中包含了很多绘制图形和文字的方法,所以需要加载import java.awt.*。 由于Applet程序本身是图形界面,对于图形、图像的处理非常的方便,所以以下的程序主要使用Applet程序,需要加载import java.applet.*。 Graphics类主要的方法如书中表8-2所示。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.1 绘制线段 Java定义的窗口工作区是以整个屏幕的左上角为坐标原点(0,0),以象素为单位。 绘制线段有drawLine()、drawPolyline()两种方法。 1.drawLine()用来绘制一段直线。其语法如下: drawLine(int x1, int y1, int x2, int2); 其中x1, y1代表选段的起点。 x2,y2代表线段的终点。 2.drawPolyline()用来绘制多边形线段。其语法如下: drawPolyline(int x[],int y[],int npoints); 其中x[]、y[]为多边形线段顶点坐标的位置。 npoints表示多边形顶点的数目。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.2 绘制矩形 前面介绍的drawPolyline()若将顶点坐标设定,使画出线段距离大小一样,就可以画出一个正方形,也可以画出一个矩形。 在Java语言中,绘制矩形有clearRect()、clipRect()、drawRect()、fillRect()和setClip()等方法。 下面分别介绍如下: 1.clearRect()-用来清除矩形。其语法如下: clearRect(int x,int y,int w,int h); 其中x, y为清除矩形左上角顶点的坐标。 w为矩形的宽度,h为矩形的高度。 2.clipRect()-用来限制矩形的图形范围。其语法如下: clipRect(int x,int y,int w,int h); 其中x, y为限制矩形图形范围左上角顶点的坐标。 w为矩形的宽度,h为矩形的高度。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.2 绘制矩形 3.drawRect()-用来绘制一个矩形。其语法如下: drawRect(int x, int y, int w, int h); 其中x,y为绘制矩形左上角顶点的坐标。 w为矩形的宽度,h为矩形的高度。 4.fillRect()-用来绘制一个矩形并在其封闭空间填充颜色。其语法如下: fillRect(int x, int y, int w, int h); 其中x,y为绘制填满矩形的左上角顶点的坐标。 w为矩形的宽度,h为矩形的高度。 5.setClip()-用来设定限制图形范围的矩形。其语法如下: setClip(int x, int y, int w, int h); 其中x,y为设定限制图形范围矩形的左上角顶点的坐标。 w为矩形的宽度,h为矩形的高度。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.3 绘制圆矩形 绘制圆矩形有drawRoundRect()和fillRoundRect()等方法。 1.drawRoundRect()-用来绘制圆矩形。其语法如下: drawRoundRect(int x, int y, int w, int h); 其中x, y为绘制圆矩形左上角的坐标。 w为圆矩形的宽度,h为圆矩形的高度。 2.fillRoundRect()-用来绘制圆矩形,并在其封闭空间填充颜色。其语法如下: fillRoundRect(int x, int y, int w, int h, int arcw, int arch); 其中x, y为绘制圆矩形左上角的坐标。 w为圆矩形的宽度,h为圆矩形的高度。 arcw为圆矩形圆弧的宽度,arch为圆矩形圆弧的高度。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.4 绘制弧形 绘制弧形有drawArc()和fillArc()等方法。 1.drawArc()-用于绘制弧形。其语法如下: drawArc(int x, int y, int w, int h, int p, int q); 其中x, y为绘制弧形的中心。 w为弧形的宽度,h为弧形的高度。 p为弧形的起始角度。q为弧形的弧度。q为正,表顺时针方向;q为负,表逆时针方向。 2.fillArc()-用于绘制填满内部的弧形。其语法如下: fillArc(int x,int y, int w,int h,int p,int q); 其中x, y为绘制弧形的中心。 w为弧形的宽度,h为弧形的高度。 p为弧形的起始角度。 q为弧形的弧度。 q为正,表顺时针方向;q为负,表逆时针方向。
8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.5 绘制椭圆形 绘制椭圆形有drawOval()和fillOval()等方法。 1.drawOval():用于绘制椭圆形。其语法如下: drawOval(int x, int y, int w, int h,); 其中x, y为绘制椭圆形的圆心。 w为椭圆形的宽度,h为椭圆形的高度。 2.fillOval():用于绘制填满内部的椭圆形。 其语法如下: fillOval(int x,int y, int w,int h); 其中x, y为绘制椭圆形的圆心。 w为椭圆形的宽度,h为椭圆形的高度。
8.3 简单图形用户界面 8.3.4 设置颜色 绘图离不开颜色,图形中的颜色分前景色和背景色。显示的字符和图形的颜色用Color类的对象控制,每个Color对象代表一种颜色,用户可以直接使用Color类中定义好的颜色常量,也可以通过调配红、绿、蓝三原色的比例创建自己的Color对象。 Color类中定义了三种构造方法: Color(float r,float g,float b):指定三原色的浮点值,每个参数的取值范围在0.0至1.0之间。 Color(int r,int g,int b):指定三原色的整数值,每个参数的取值范围在0至288之间。 Color(int rgb):指定一个整数代表三原色的混合值,16~23比特位代表红色,8~18比特位代表绿色,0~7比特位代表蓝色。 不论使用哪个构造方法创建Color对象,都需要指定新建颜色中红、绿、蓝三色的比例。 Color类中定义了13种颜色常量,使用时只需加上Color前缀,十分方便。 Color的颜色常量如书中表8-3所示 。
8.3 简单图形用户界面 8.3.4 设置颜色 对于GUI的控制组件,它们有四个与颜色有关的方法分别用来设置和获取组件的背景色和前景色: public void setBackground(Color c); public Color getBackground(); public void setForeground(); public getForeground(); 方法的参数是java.awt.Color类的实例。你也可以使用颜色常量,如Color.red,Color.blue等。 例如,你可以创建一个特定的颜色: int r = 288, g = 288, b = 0; Color c = new Color(r, g, b); 上述构造方法根据指定的红色、绿色和蓝色的数值(它们的范围都是0~288)来创建一个颜色。
8.3 简单图形用户界面 8.3.5 显示图像 图像是由专门的软件或截取图像的工具生成的文件。在Java的Graphics类中不仅提供了大量绘制图形的方法,还提供了一些方法来显示图像。 我们需要图像文件在Java程序运行时,找到它的存储位置,将它加载到内存里,然后在适当的时候通过Graphics类中drawImage()方法将它显示在屏幕上就可以了。 getImage()方法有两个参数,第一个参数是图像文件所在的URL(统一资源定位器)地址。在上面例子中由于图像文件与HTML文件保存在同一个路径下,所以使用Applet类的另一个方法getCodeBase()或getDocumentBase()来获取含有该Applet类的HTML文件的URL地址。getImage()方法的第二个参数是图像文件的文件名。
8.3 简单图形用户界面 8.3.5 显示图像 由于Java是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分是直接读取web服务器上的图像文件。 getImage()方法返回一个Image对象,它的调用格式为: Image getImage(URL url) Image getImage(URL ur1, String name) 其中url是一个URL类的对象,代表一个网络地址,例如我们访问搜狐网站服务器指定位置的一幅图片: getImage(new URL(www.sohu.com/graphics/a.jpg)); drawImage()方法是Graphics类中用来显示图像的方法。它可以将Image对象关联的图像显示在Applet的指定位置。
8.3 简单图形用户界面 8.3.5 显示图像 drawImage()方法的调用格式如下: boolean drawImage(Image img, int xr int y, ImageObserver observer) boolean drawImage (Image img, int x, int y, Color bgcolor, ImageObserver observer) img是保存图像的Image对象。x,y是图像的左上角的坐标,它们决定了图像在容器中显示位置。bgcolor是图像显示区域的背景色。observer是图像加载跟踪器,通常将该参数指定为this,即由Applet负责跟踪图像的加载情况。drawImage()方法可以不失真地按比例对图像进行缩放。 Java可以识别的图像文件格式有jpg、gif、jpeg等。
8.4 Java事件处理 8.4.1 Java事件处理机制 如果用户在用户界面执行了一个动作,这将导致一个事件的发生。事件是描述发生了什么的对象。在Java中,定义了各种不同类型的事件类,用来描述各种类型的用户操作。 事件是由事件源产生的,事件的产生者称为事件源。例如,在Button组件上点击鼠标会产生以这个Button为源的一个事件:ActionEvent。 事件源拥有自己的方法,我们通过它向其注册事件监听器。事件监听器是一个类的实例,这个类实现了一个特殊的接口,称为Listener interface。当事件源产生了一个事件以后,事件源就会发送通知给相应的事件监听器,监听器对象根据事件对象内封装的信息,决定如何响应这个事件。
8.4 Java事件处理 8.4.1 Java事件处理机制 所有的组件都从Component类中继承了将事件处理授权给监听器的方法: addXXXListener(ListenerType listener): //将事件源注册给事件处理程序(监听者) removeXXXListener(ListenerType listener): //取消事件源的注册 在Java中,所有的事件都定义在类库java.awt.event中,用相应的类来表达不同的事件,例如键盘事件类KeyEvent,鼠标事件类MouseEvent等。这些事件类都是从AWTEvent类派生而来的。 事件类的继承关系如图8-9所示。
8.4 Java事件处理 8.4.1 Java事件处理机制 事件类的继承关系如图8-9所示。 图8-9 Java事件类的继承关系 图8-9 Java事件类的继承关系
8.4 Java事件处理 8.4.1 Java事件处理机制 AWT将事件分为两类: 1.语义(Semantic)事件: ActionEvent:对应按钮点击、菜单选择、列表框选择、在文本域中按回车键等。 AdjustmentEvent:用户调整滚动条。 ItemEvent:用户从一组选择框或者列表项中进行选择。 TextEvent:文本域或者文本框中的内容发生改变。 2.低级(Low-Level)事件: ComponentEvent:组件大小改变、移动、显示或者隐藏。 KeyEvent:键盘上的一个键被按下或者释放。 MouseEvent:鼠标按键被按下、释放、鼠标移动或者拖动。 FocusEvent:组件获得焦点或者失去焦点。 WindowEvent:窗口被激活、屏蔽、最小化、最大化或关闭。 ContainerEvent:添加或者删除一个组件。
8.4 Java事件处理 • 8.4.2 按钮点击事件 • 按钮是最常用到的组件,因此它的事件处理是非常重要的。 • 创建按钮的方法是: • Button MyButton = new Button(“Java”); • 通过Container类的Add方法,将组件加入到该容器中。 • class MyPanel extends Panel • { • public MyPanel() • { • Button MyButton = new Button(“Java”); • add(MyButton); • } • }
8.4 Java事件处理 8.4.2 按钮点击事件 然后为按钮设置监听器。指定的监听器必须实现ActionListener接口的actionPerformed方法: public void actionPerformed(ActionEvent event) 事件处理模型中的监听者都是通过实现在包java.awt.event中提供的监听者接口来获得的。每种事件都对应有相应的监听者接口,事件的处理方法都已经在该接口中定义了。
8.4 Java事件处理 8.4.3 捕获窗口事件 Frame对象是窗口事件(WindowEvent)的事件源,要指定一个监听器对象: MyWindowListener listener = ...; frame.addWindowListener(listener); 监听器对象要实现WindowListener接口。WindowListener接口中共有七个方法,它们分别对应七个窗口事件: public interface WindowListener { void windowOpened(WindowEvent e); void windowClosing(WindowEvent e); void windowClosed(WindowEvent e); void windowIconified(WindowEvent e); void windowDeiconified(WindowEvent e); void windowActivated(WindowEvent e); void windowDeactivated(WindowEvent e); }
8.4 Java事件处理 8.4.3 捕获窗口事件 WindowListener接口实现方法是:定义一个类来实现WindowListener接口,在需要的方法中添加我们需要的代码,然后让其他方法为空即可。 class QuitWindow implements WindowListener { public void windowClosing(WindowEvent e) { System.exit(0); } void windowOpened(WindowEvent e) {} void windowClosed(WindowEvent e) {} void windowIconified(WindowEvent e) {} void windowDeiconified(WindowEvent e) {} void windowActivated(WindowEvent e) {} void windowDeactivated(WindowEvent e) {} } 使用以上代码,我们可以关闭一个Frame窗口。
8.4 Java事件处理 • 8.4.4 键盘事件 • 键盘事件对应着KeyEvent类,对应三个具体的事件:KEY_PRESSED(按下键)、KEY_RELEASED(松开键)、KEY_TYPED(击键)。判断一个KeyEvent类的对象到底代表哪种事件,可以用它的方法getID()的返回值与事件常量相比来得到。 • KeyListener接口中有三个方法: • public void keyPressed(KeyEvent e) • public void keyReleased(KeyEvent e) • public void keyTyped(KeyEvent e)
8.4 Java事件处理 8.4.4 键盘事件 Java对于用户按键的处理过程: 当前键盘状态为小写状态,要输入一个大写字母“A”,我们的操作过程为:先按住Shift键不放,再按下A键,然后松开。整个过程Java会产生五个事件: 按下Shift键:为VK_SHIFT调用keyPressed方法; 按下A键:为VK_A调用keyPressed方法; 键入字符“A”:为字符“A”调用keyTyped方法; 松开A键:为VK_A调用keyReleased方法; 松开Shift键:为VK_SHIFT调用keyReleased方法。
8.4 Java事件处理 8.4.5 鼠标事件 鼠标事件对应MouseEvent类。它有两个监听者接口与之对应,一个是MouseListener接口(它有五个事件);一个是MouseMotionListener接口(它有两个事件)。 MouseListener接口 : mousePressed:鼠标键被按下时调用; mouseReleased:鼠标键被释放时调用; mouseClicked:合并上述两个事件为一次鼠标点击事件。 mouseEntered:进入指定的区域。 mouseExited:离开指定的区域。 它们的参数是MouseEvent,通过getX和getY方法,能够得到鼠标点击时的鼠标指针x和y的坐标。通过getClickCount方法,可以区别是单击操作,还是双击操作。 MouseMotionListener接口 : mouseMoved:鼠标移动; mouseDragged:用户拖动鼠标。
8.4 Java事件处理 • 8.4.6 焦点事件 • 如果某个组件能够接收用户按键,那么该组件就拥有焦点。拥有焦点的组件在显示形式上与其他组件有一些差别:文本域内会显示光标;按钮四周会显示一个由虚线组成的矩形框。可以捕获丢失的焦点事件来进行输入的合法性检查。如果输入不合法,通过调用requestFocus方法把焦点重新移回到该文本域,提示用户重新输入: • public void focusLost(FocusEvent event) • { • if(event.getComponent()==passText&&!event.isTemporary()) • { //passText为需要进行合法性检查的文本域 • if(!isFormatValid(passText.getText())) • // isFormatValid为自定义方法,用户检查合法性 • passText.requestFocus(); • } • } • Java支持的事件类型很多,书中表8-4列出了Java中各个事件类型、接口及相关方法。