第 8 章 图形用户界面的设计与实现

91
8 8 第第第第第第第第第第第第 第第第第第第第第第第第第 第第第第 Java 第第第第第第第第第 第第第第第第第第 第第第第第第第第第 第第第第第第第第第第第第第第第第第第第 ,、、 第第第第第第 8.1 Java 第第第第第第第第 8.2 第第第第 8.3 第第第第第第第第 8.4 Java 第第第第 8.5 第第第第 8.6 第第第第第第 8.7 Swing 第第 第第第第第 8

Upload: barney

Post on 22-Jan-2016

119 views

Category:

Documents


2 download

DESCRIPTION

第 8 章 图形用户界面的设计与实现. 本章介绍 Java 基本的图形编程知识,包括窗口的显示、文字和图像的显示、事件处理以及图形用户界面中常用的组件等内容。 本章要点 8.1 Java 图形用户界面概述 8.2 标准组件 8.3 简单图形用户界面 8.4 Java 事件处理 8.5 布局管理 8.6 常用标准组件 8.7 Swing 组件 思考与练习 8. 8.1 Java 图形用户界面概述. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 8 章  图形用户界面的设计与实现

第第 88 章 图形用户界面的设计与实现章 图形用户界面的设计与实现本章介绍 Java 基本的图形编程知识,包括窗口的显示、文字和图像的显示、

事件处理以及图形用户界面中常用的组件等内容。

本章要点 8.1 Java 图形用户界面概述 8.2 标准组件 8.3 简单图形用户界面 8.4 Java 事件处理 8.5 布局管理 8.6 常用标准组件 8.7 Swing 组件 思考与练习 8

Page 2: 第 8 章  图形用户界面的设计与实现

8.1 Java8.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 中显示了到主要类之间的关系。

Page 3: 第 8 章  图形用户界面的设计与实现

8.1 Java8.1 Java 图形用户界面概述图形用户界面概述

图 8-1 awt 包中主要类之间的关系

Page 4: 第 8 章  图形用户界面的设计与实现

8.1 Java8.1 Java 图形用户界面概述图形用户界面概述Java 中设计和实现图形用户界面的工作主要有:1. 创建组件( Component) :创建组成界面的各种元素,如按钮、文本框等。2. 指定布局( Layout ):根据具体需要排列组件的位置关系。3. 响应事件( Event ):定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。Java 中构成用户界面的各种元素和成分可以分为三类:容器、控制组件和用户自定义成分。1. 容器容器是用来组织其他界面成份和元素的单元。一般说来 , 一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面成份和元素,这些界面元素本身又可以是一个容器,这个容器将再进一步包含它的界面成份和元素,依次类推就构成一个复杂的图形界面系统。

Page 5: 第 8 章  图形用户界面的设计与实现

8.1 Java8.1 Java 图形用户界面概述图形用户界面概述容器的主要作用和特点有:(1) 容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。(2) 容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。(3) 容器通常都有一个背景,这个背景覆盖全部容器,可以透明,也可以指定一幅特殊的图案,使界面生动化和个性化。(4) 容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。(5) 容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。(6) 容器可能被包含在其他容器之中。

Page 6: 第 8 章  图形用户界面的设计与实现

8.1 Java8.1 Java 图形用户界面概述图形用户界面概述2. 控制组件

与容器不同,控制组件是图形用户界面的最小单位之一,它里面不再包含其他的元素。控制组件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。从某种程度上来说,控制组件是图形用户界面标准化的结果。3. 用户自定义成分除了标准的图形界面元素,编程人员还可以根据用户需要设计一些用户自定义的图形界面成份,例如绘制一些几何图形,使用标志图案等。用户自定义成份由于不能像标准界面元素一样被系统识别和承认,所以通常只能起到装饰、美化等作用,而不能响应用户的动作,不具有交互功能。

Page 7: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件8.2.1 组件分类Java 的图形用户界面的最基本组成部分是组件( Component ),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。AWT 组件分为容器( Container )类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮( Button )、标签( Label )、文本类组件( TextComponent )等。java.awt 包中的常用组件,如图 8-2 和图 8-3 所示。

Page 8: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件8.2.1 组件分类

图 8-2 Component 类的常用组件

Page 9: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件8.2.1 组件分类

图 8-2 Component 类的常用组件图 8-3 MenuComponent 类的常用组件

Page 10: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件8.2.1 组件分类

图 8-3 MenuComponent 类的常用组件

Page 11: 第 8 章  图形用户界面的设计与实现

8.2 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) : 设置容器布局

Page 12: 第 8 章  图形用户界面的设计与实现

8.2 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) : 设置容器布局

Page 13: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件8.2.3 控制组件 基本的控制组件是用来提供人机交互的基本控制界面,包括:•按钮 (Button)•单选按钮 (CheckboxGroup)•复选框 (Checkbox)•下拉列表框 (Choice)•画板( Canvas )•列表框 (List)•标签 (Label)•文本组件 (Textfield 和 TextArea)•滚动条 (Scrollbar)•菜单 (Menu)等等

Page 14: 第 8 章  图形用户界面的设计与实现

8.2 8.2 标准组件标准组件

8.2.3 控制组件 使用控制组件,通常需要如下步骤:1. 创建某控制组件类的对象,指定其大小等属性。2. 使用某种布局策略,将该控制组件对象加入到某个容器中的某个指定位置处。3. 将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件处理方法,实现利用该组件对象与用户交互的功能。

Page 15: 第 8 章  图形用户界面的设计与实现

8.2 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() :使组件获得焦点

Page 16: 第 8 章  图形用户界面的设计与实现

8.2 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 )的区域

Page 17: 第 8 章  图形用户界面的设计与实现

8.2 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() :使组件获得焦点

Page 18: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.1 Frame 与 Panel一般我们要生成一个窗口,通常是用 Window 的子类 Frame 来进行实例化,而不是直接用到 Window 类。 Frame 的外观就像我们平常在 windows 系统下见到的窗口,有标题、边框、菜单、大小等等。每个 Frame 的对象实例化以后,都是没有大小和不可见的,因此必须调用 setSize( ) 来设置大小,调用 setVisible(true) 来设置该窗口为可见的。另外, AWT 在实际的运行过程中是调用所在平台的图形系统,因此同样一段 AWT 程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在 windows下运行,则显示的窗口是 windows风格的窗口;而在 UNIX下运行时,则显示的是 UNIX风格的窗口。

Page 19: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.1 Frame 与 PanelFrame 类具有以下特点:Frame 类是 Window 类的直接子类;Frame 对象显示的效果是一个“窗口”,带有标题和尺寸;Frame默认初始化为不可见的,可使用 setVisible(true) 方法使之变为可见;默认的布局管理器是 BorderLayout ,可使用 setLayout() 方法改变其默认布局管理器。Frame 的构造方法有:Frame f=new Frame();Frame f=new Frame(String s);s 为 Frame 的标题字符串。

Page 20: 第 8 章  图形用户界面的设计与实现

8.3 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中存放着当前窗口的大小。

Page 21: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.1 Frame 与 Panel3. 隐藏和显示一个窗口当一个 frame 窗口被创建以后,这个窗口默认是不可见的,除非你调用它的setVisible( ) 方法。如下所示:void setVisible(boolean visibleFlag)如果这个方法的参数是 true ,那么调用它的组件是可见的。否则,就被隐藏。4. 设置窗口标题你可以通过使用 setTitle( ) 方法来改变一个 frame 窗口的标题。如下所示:void setTitle(String newTitle)在这里,参数 newtitle 是窗口的新标题。

Page 22: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.1 Frame 与 Panel5. 关闭 frame 窗口当使用一个 frame 窗口时,你的程序必须在它被关闭时通过调用 setVisible(false) 方法来将窗口从屏幕中除去。为了截获窗口关闭事件,你必须实现 WindowListener监听器接口的 windowClosing( ) 方法。在 windowClosing( ) 方法中,你必须将窗口从屏幕中除去。在下一节中将讲解这种技术。

Page 23: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.1 Frame 与 Panel

Panel 类具有以下特点:Panel 不是顶层窗口,它必须位于窗口或其他容器之内;Panel 可以容纳其他组件,在程序中经常用于布局和定位;Panel默认的布局管理器是 FlowLayout ,可使用 setLayout() 方法改变其默认布局管理器;Panel 可以采用和所在容器不同的布局管理器。

Page 24: 第 8 章  图形用户界面的设计与实现

8.3 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 :正常字体

Page 25: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面8.3.2 字体设置 它们可以互相组合使用,例如: Font.BOLD+Font.ITALICsize 代表字体大小,单位是 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 类的主要方法。

Page 26: 第 8 章  图形用户界面的设计与实现

8.3 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 方法来实现。该方法返回一个字符串数组,数组内包含所有可用的字体名。

Page 27: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.3 绘制简单图形绘制图形和文字都要用到 Graphics 类。 Graphics 是 java.awt 包中的一个类,其中包含了很多绘制图形和文字的方法,所以需要加载 import java.awt.* 。由于 Applet 程序本身是图形界面,对于图形、图像的处理非常的方便,所以以下的程序主要使用 Applet 程序,需要加载 import java.applet.* 。Graphics 类主要的方法如书中表 8-2 所示。

Page 28: 第 8 章  图形用户界面的设计与实现

8.3 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表示多边形顶点的数目。

Page 29: 第 8 章  图形用户界面的设计与实现

8.3 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 为矩形的高度。

Page 30: 第 8 章  图形用户界面的设计与实现

8.3 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 为矩形的高度。

Page 31: 第 8 章  图形用户界面的设计与实现

8.3 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 为圆矩形圆弧的高度。

Page 32: 第 8 章  图形用户界面的设计与实现

8.3 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为负,表逆时针方向。

Page 33: 第 8 章  图形用户界面的设计与实现

8.3 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 为椭圆形的高度。

Page 34: 第 8 章  图形用户界面的设计与实现

8.3 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 所示 。

Page 35: 第 8 章  图形用户界面的设计与实现

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) 来创建一个颜色。

Page 36: 第 8 章  图形用户界面的设计与实现

8.3 8.3 简单图形用户界面简单图形用户界面

8.3.5 显示图像图像是由专门的软件或截取图像的工具生成的文件。在 Java 的 Graphics类中不仅提供了大量绘制图形的方法,还提供了一些方法来显示图像。我们需要图像文件在 Java 程序运行时,找到它的存储位置,将它加载到内存里,然后在适当的时候通过 Graphics 类中 drawImage() 方法将它显示在屏幕上就可以了。getImage() 方法有两个参数,第一个参数是图像文件所在的 URL (统一资源定位器)地址。在上面例子中由于图像文件与 HTML 文件保存在同一个路径下,所以使用 Applet 类的另一个方法 getCodeBase()或 getDocumentBase() 来获取含有该 Applet 类的 HTML 文件的 URL 地址。 getImage()方法的第二个参数是图像文件的文件名。

Page 37: 第 8 章  图形用户界面的设计与实现

8.3 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 的指定位置。

Page 38: 第 8 章  图形用户界面的设计与实现

8.3 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, ImageObserverobserver)img 是保存图像的 Image 对象。 x,y 是图像的左上角的坐标,它们决定了图像在容器中显示位置。 bgcolor 是图像显示区域的背景色。 observer 是图像加载跟踪器,通常将该参数指定为 this ,即由 Applet负责跟踪图像的加载情况。 drawImage() 方法可以不失真地按比例对图像进行缩放。Java 可以识别的图像文件格式有 jpg 、 gif 、 jpeg 等。

Page 39: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理

8.4.1 Java 事件处理机制如果用户在用户界面执行了一个动作,这将导致一个事件的发生。事件是描述发生了什么的对象。在 Java 中,定义了各种不同类型的事件类,用来描述各种类型的用户操作。事件是由事件源产生的,事件的产生者称为事件源。例如,在 Button 组件上点击鼠标会产生以这个 Button 为源的一个事件: ActionEvent 。 事件源拥有自己的方法,我们通过它向其注册事件监听器。事件监听器是一个类的实例,这个类实现了一个特殊的接口,称为 Listener interface 。当事件源产生了一个事件以后,事件源就会发送通知给相应的事件监听器,监听器对象根据事件对象内封装的信息,决定如何响应这个事件。

Page 40: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理

8.4.1 Java 事件处理机制所有的组件都从 Component 类中继承了将事件处理授权给监听器的方法:addXXXListener(ListenerType listener) ://将事件源注册给事件处理程序(监听者)removeXXXListener(ListenerType listener) ://取消事件源的注册在 Java 中,所有的事件都定义在类库 java.awt.event 中,用相应的类来表达不同的事件,例如键盘事件类 KeyEvent ,鼠标事件类MouseEvent等。这些事件类都是从 AWTEvent 类派生而来的。事件类的继承关系如图 8-9所示。

Page 41: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理 8.4.1 Java 事件处理机制事件类的继承关系如图 8-9所示。图 8-9 Java 事件类的继承关系

图 8-9 Java 事件类的继承关系

Event Obj ect

AWT Event

Act i onEvent

Adj ust mentEvent

ComponentEvent

I t emEvent

TextEvent

Cont ai nerEvent

FocusEvent

I nputEvent

Pai ntEvent

Wi ndowEvent

Key Event Mouse Event

Page 42: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理 8.4.1 Java 事件处理机制AWT 将事件分为两类:1.语义( Semantic )事件:ActionEvent :对应按钮点击、菜单选择、列表框选择、在文本域中按回车键等。AdjustmentEvent :用户调整滚动条。ItemEvent :用户从一组选择框或者列表项中进行选择。TextEvent :文本域或者文本框中的内容发生改变。2.低级( Low-Level )事件:ComponentEvent :组件大小改变、移动、显示或者隐藏。KeyEvent :键盘上的一个键被按下或者释放。MouseEvent :鼠标按键被按下、释放、鼠标移动或者拖动。FocusEvent :组件获得焦点或者失去焦点。WindowEvent :窗口被激活、屏蔽、最小化、最大化或关闭。ContainerEvent :添加或者删除一个组件。

Page 43: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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);

}}

Page 44: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理

8.4.2 按钮点击事件然后为按钮设置监听器。指定的监听器必须实现 ActionListener 接口的 actionPerformed 方法:public void actionPerformed(ActionEvent event)事件处理模型中的监听者都是通过实现在包 java.awt.event 中提供的监听者接口来获得的。每种事件都对应有相应的监听者接口,事件的处理方法都已经在该接口中定义了。

Page 45: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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);

}

Page 46: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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 窗口。

Page 47: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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)

Page 48: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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 方法。

Page 49: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理 8.4.5 鼠标事件鼠标事件对应MouseEvent 类。它有两个监听者接口与之对应,一个是 MouseListener 接口(它有五个事件);一个是MouseMotionListener 接口(它有两个事件)。MouseListener 接口 :mousePressed :鼠标键被按下时调用;mouseReleased :鼠标键被释放时调用;mouseClicked :合并上述两个事件为一次鼠标点击事件。mouseEntered :进入指定的区域。mouseExited :离开指定的区域。它们的参数是MouseEvent ,通过 getX和 getY方法,能够得到鼠标点击时的鼠标指针 x和 y 的坐标。通过 getClickCount 方法,可以区别是单击操作,还是双击操作。MouseMotionListener 接口 :mouseMoved :鼠标移动;mouseDragged :用户拖动鼠标。

Page 50: 第 8 章  图形用户界面的设计与实现

8.4 Java8.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 中各个事件类型、接口及相关方法。

Page 51: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理

一般说来,每个事件类都至少有一个监听者接口与之相对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之相对应。当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件。在一个类中可以实现多个监听者接口,通过它可以同时监听同一个事件源上发生的多种事件。同时,通过事件可以获得事件的详细信息。

Page 52: 第 8 章  图形用户界面的设计与实现

8.4 Java8.4 Java 事件处理事件处理 8.4.7 事件适配器由于通过实现接口 XXXListener 来完成事件处理时,要同时实现该接口中的所有方法。但是有时候,我们只是需要对其中的某些方法做处理,而不想实现所有的无关方法。因此,为了方便起见, Java 为某些监听者接口提供了适配器类( XXXAdapter ),当需要对某种事件进行处理时,只需让事件处理类继承事件所对应的适配器类,只重写需要关注的方法即可,而无关的方法就不必实现了。适配器是一个类而不是接口,因而处理事件的类只能继承一个适配器。当该类需要处理多种事件时,通过继承适配器类的方式是不行的。但可以基于适配器类,用内嵌类( Inner Class )的方法来处理这种情况。事件适配器包括以下几种:ComponentAdapter :组件适配器;

ContainerAdapter :容器适配器;FocusAdapter :焦点适配器;KeyAdapter :键盘适配器;MouseAdapter :鼠标适配器;MouseMotionAdapter :鼠标运动适配器;WindowAdapter :窗口适配器;

Page 53: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理在 Java 的 GUI 界面设计中,布局控制是相当重要的一环节。将一个组件加入容器中时,布局控制决定了所加入的组件的大小和位置。而布局管理器能自动设定容器中的组件的大小和位置,当容器改变大小时,布局管理器能自动地改变其中组件的大小和位置。java.awt 包中共定义了五种布局管理类,每个布局管理类对应一种布局策略,分别是 FlowLayout , BorderLayout , CardLayout , GridLayout 和 GridBagLayout 。下面将详细讨论这几种布局管理器。

Page 54: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理

8.5.1 FlowLayout 类FlowLayout 是容器 Panel 和 Applet 类默认使用的布局管理器,如果不专门为 Panel或 Applet 指定布局管理器,则它们就使用FlowLayout 。FlowLayout 对应的布局策略非常简单。这种策略配置组件的方式是:1. 组件按照加入的先后顺序从左向右排列。2. 一行排满之后就下转到下一行继续从左至右排列。3.每一行中的组件都居中排列。在组件不多时,使用这种策略非常方便,但是当容器内的 GUI元素增加时,就显得高地参差不齐。表 8-5 列出了 FlowLayout 的属性。

Page 55: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理8.5.1 FlowLayout 类对于使用 FlowLayout 的容器,加入组件使用如下简单的命令:add( 组件名 );这些组件将顺序的排列在容器中。如果一个容器原来不使用 FlowLayout 布局方式,现在要改为 FlowLayout 布局策略,使用如下的语句:setLayout(new FlowLayout());setLayout ()方法是所有容器的父类 Container 的方法,用于为容器设定布局。如果想将组件设定缺省居中的话, FlowLayout 构造方法中的参数允许将组件左对齐或右对齐。对齐的值必须是 FlowLayout.LEFT , FlowLayout.RIGHT ,或 FlowLayout.CENTER 。例如:setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 40));

Page 56: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理

8.5.2 BorderLayout 类BorderLayout 是容器 Frame 和 Dialog默认使用的布局管理器。BorderLayout也是一种简单的布局管理策略。它把容器内的空间划分成五个明显的区域:东、南、西、北、中。北占据容器的上方,东占据容器的右侧,南占据容器的下方,西占据容器的左侧。中间区域是在东、南、西、北都填满后剩下的区域。当窗口垂直延伸时,南、北、中区域也延伸;而当窗口水平延伸时,东、西、中区域也延伸。如果某个区域没有分配组件,则其他组件可以占据它的空间。例如,如果北部没有分配组件,则西部和东部的组件将向上扩展到容器的最上方。如果东部和西部没有分配组件,则位于中部的组件将横向扩展到容器的左右边界。书中表 8-8 列出了 BorderLayout 的属性。

Page 57: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理

8.5.3 GridLayout 类GridLayout 布局方式可以使容器中的各组件呈网格状分布。容器中各组件的高度和宽度相同,当容器的尺寸发生变化时,各组件的相对位置不变,但各自的尺寸会发生变化。各组件的排列方式为:从上到下,从左到右。与 BorderLayout 类相类似,如果想在一个网格单元中添加多个组件,则必须先在该网格单元放一个容器,再将多个组件放在该容器中。书中表 8-11 列出了 GridLayout 的构造方法。

Page 58: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理

8.5.4 CardLayout 类CardLayout 类在处理容器内的组件时,容器表面上可以容纳多个组件。但在同一个时间容器只能从这些组件中选出一个来显示,就像一副扑克牌每次只能显示最上面的一张一样,而且可以向前翻阅组件,也可以向后翻阅组件书中表 8-13 列出了 CardLayout 的构造方法。

Page 59: 第 8 章  图形用户界面的设计与实现

8.5 8.5 布局管理布局管理

8.5.5 GridBagLayout 类GridBagLayout 布局方式是 AWT 中最灵活、同时也是最复杂的一种布局方式。与 GridLayout 相同,它也是将容器中的组件按照行、列的方式放置,但各组件所占的空间可以互不相同。GridBagLayout 根据对每个组件所施加的空间限制、每个组件自身所设定的最小尺寸和最佳尺寸来为每个组件分配空间。对组件施加空间限制是通过类 GridBagConstraints 来实现的。

Page 60: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件组件允许用户同应用程序用各种方式进行交互,例如,一个常用的组件是按钮。下面我们介绍 GUI 常用组件的使用方法,希望大家从中可以体会出每个组件的特点。8.6.1 按钮 (Button)按钮在实际应用中比较常见,通常用来触发某个事件的发生,提供了“按下并动作”的基本用户界面。例如,点击播放按钮,开始播放音乐等。按钮一般对应一个事先定义好的功能操作,并对应一段程序。当用户点击按钮时,系统自动执行与该按钮相联系的程序,从而完成预先指定的功能。1. 创建按钮用相应的构造方法来创建按钮,如书中表 8-15 所示。例如,下面的语句用来创建按钮,传递给构造方法的字符串参数指明了按钮上的标签:

Button enter=new Button(“ 按钮” );2.常用方法:按钮常用方法如书中表 8-16 所示。

Page 61: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.1 按钮 (Button)3. 事件响应

按钮可以引发动作( AcitonEvent )事件,可以用 ActionListener 来监听。当用户单击一个按钮时就引发了一个动作事件,希望响应按钮引发的动作事件的程序必须把按钮注册给实现了 ActionListener 接口的动作事件监听者。同时,为这个接口的 actionPerformed(ActionEvent e) 方法书写方法体。在方法体中,可以调用 e.getSource() 方法来获取引发动作事件的按钮对象引用,也可以调用 e.getActionCommand() 方法来获取按钮的标签或事先为这个按钮设置的命令名。

Page 62: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.1 按钮 (Button)例如,下面的代码可以构造一个带文本标签的按钮,用来告诉用户它的作用:Button b = new Button("Sample");b.addActionListener(this); add(b); 任何实现了被注册为监听者的 ActionListener 接口的类,它的 actionPerformed() 方法将在一个按钮被鼠标点击“按下”时被调用。它是引发某个动作执行的事件。能够触发这个事件的动作包括如下几种:•单击按钮。•双击一个列表中的选项。•选择菜单项。•在文本框中输入回车。

Page 63: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.2 标签 (Label)一个标签对象显示一行静态文本。程序可以改变标签的内容,但用户不能改变。标签可以起到信息说明的作用,每个标签用一个 Label 类的对象表示。标签没有任何特殊的边框和装饰。

1. 创建标签

标签的构造方法如书中表 8-17 所示。例如,下面的语句在创建标签对象的同时说明了这个标签中的字符串:Label prompt=new Label (“请输入一个整数:” );标签的属性如书中表 8-18 所示。

Page 64: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.2 标签 (Label)2. 常用方法标签的常用方法如表 8-19 所示:3. 事件响应标签不能接受用户的输入,所以一般不处理特定的事件。当然他还可以处理许多普通的事件,如 mouse 事件等。

Page 65: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.3 文本组件Java 用于处理文本的组件有两种:单行文本框 TextField 和多行文本区 TextArea ,他们都是 TextComponent 的子类。TextComponent 类的主要方法如书中表 8-20 所示。8.6.3.1 文本框 (TextField)文本框 TextField 用于接受用户通过键盘输入的可编辑单行文本。1. 创建文本框文本框的构造方法如书中表 8-21 所示。例如:

TextField f1 = new TextField(30);TextField f2 = new TextField("Hello",30);

Page 66: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.3 文本组件2. 常用方法除了继承 TextComponent 的方法外, TextField 类还定义了一些常用的方法。其中,我们可以使用 setEchoChar() 方法来设置回显字符。例如,在输入密码时,无论输入什么字符,都被回显成“ *” ,达到保密的目的,可以调用如下的语句:TextField f =new TextField(“请输入密码” );f.setEchoChar(‘*’);另外, TextField 定义的 echoCharIsSet() 方法还可以设置当前文本框是否处于不回显的状态。3. 事件响应在 TextField 中,当按下回车键时, ActionListener 可以通过 actionPerformed()知道这个事件。如果需要,还可以增加其他的组件监听者。除了注册一个 ActionListener ,你还可以注册一个 TextListener 来接收关于改变文本框内容的通知。也就是说,当修改文本框中的内容时,例如增加、删除文字,也可以触发另一个事件- TextEvent ,它的处理方法是 TextListener 中的 textValueChanged(TextEvent) 。

Page 67: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.3.2 文本区 (TextArea)文本框只能显示一行文本内容,满足不了所有的需要。对于大段文本内容,需要用到多行多列的文本输入设备-文本区( TextArea )。1. 创建文本区文本区的构造方法如书中表 8-22 所示。例如,下面的例子创建了一个 4行×30 列的文本区,并含有字符串“ Hello!” 。

TextArea t = new TextArea( "Hello!",4,30);文本区的属性如书中表 8-23 所示。2. 常用方法除了继承 TextComponent 的方法外, TextArea还有一些常用方法,如表8-24所示:3. 事件响应TextArea触发的事件只有 TextEvent ,它不能触发 ActionEvent 事件。也就是说,在 TextArea 中回车,不会有事件产生。

Page 68: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.4 复选框 (Checkbox)复选框( Checkbox)可以让用户作出多项选择,它有两种状态,分别为“开( ON)”和“关( OFF)”,可以用 true (选中)和 false (没选中)表示。当用户单击复选框时,复选框的状态就会改变,并且产生相应的事件。1. 创建复选框复选框的构造方法如表 8-25所示: 2. 常用方法复选框的常用方法如表 8-26所示:3. 事件响应复选框可以触发 ItemEvent 事件,选取或不选取 (取消 ) 一个复选框的事件将被送往 ItemListener 接口,处理的方法为 itemStateChanged(ItemEvent) 。选择事件 ItemEvent 类只包含一个事件,即代表选择项的选中状态发生变化的事件 ITEMSTATE_CHANGED。

Page 69: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.4 复选框 (Checkbox)引发这类事件的动作包括:改变列表类 List 对象选项的选中或不选中状态。改变下拉列表类 Choice 对象选项的选中或不选中状态。改变复选框类 Checkbox对象的选中或不选中状态。改变检测盒菜单项 CheckboxMenuItem 对象的选中或不选中状态。ItemEvent 类的主要方法有以下几种。( 1 ) public ItemSelectable getItemSelectable()此方法返回引发选中状态变化事件的事件源,例如选项变化的 List 对象或选中状态变化的 Checkbox对象,这些能引发选中状态变化事件的都是实现了 ItemSelectable 接口的类的对象,包括 List 对象、 Checkbox对象、Choice 对象等。 getItemSelectable() 方法返回的就是这些类的对象引用。

Page 70: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.4 复选框 (Checkbox)

( 2 ) public Object getItem()此方法返回引发选中状态变化事件的具体选择项,例如用户选中的 Choice中的具体 item ,通过调用这个方法可以知道用户选中了哪个选项。( 3 ) public int getStateChanged()此方法返回具体的选中状态变化类型,它的返回值在 ItemEvent 类的几个静态常量中:ItemEvent.SELECTED:代表选项被选中。ItemEvent.DESELECTED:代表选项被放弃不选。

Page 71: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.5 单选按钮 (CheckboxGroup)单选按钮 (CheckboxGroup) 是一组复选框按钮组成的,和复选框的区别是它只能进行单项选择。复选框组提供了将多个复选框作为互斥的一个集合的方法,因此在任何时刻,这个集合中只有一个复选框的值是 true ,这就是单选按钮。也就是说,单选按钮是从复选框中演变而来的。1. 创建单选按钮只要使用 CheckboxGroup 类将各个复选框连接成一组,就形成了单选按钮。2. 常用方法Checkbox 的常用方法见表 8-27 , CheckboxGroup 的方法如书中表 8-26 所示。3. 事件响应由于 CheckboxGroup 是 Object 类的直接子类,所以不能响应事件,但是按钮组中的每个按钮可以响应 ItemEvent 事件。

Page 72: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.6 下拉列表 (Choice)下拉列表组件提供了一个简单的“从列表中选取一个”类型的输入。这种选项框只能显示一个选项,要改变被选中的选项,可以单击向下箭头,从选项框中选择一个选项。1. 创建下拉列表创建下拉列表 (Choice)比较简单,例如:

Frame f = new Frame("Choice");Choice c = new Choice();// 用构造方法创建下拉列表c.add("First"); c.add("Second"); c.add("Third");// 为下拉列表加入选项c.addItemListener(this);// 注册事件f.add(c);

Page 73: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.6 下拉列表 (Choice)2. 常用方法Choice 的常用方法如表 8-28 所示。3. 事件响应下拉列表可以产生 ItemEvent 事件。

Page 74: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.7 列表 (List)一个列表将各个文本选项显示在一个区域中,这样就可以在同时看到若干个条目。当选项数目过多时,列表的右侧会出现滚动条。列表支持单选和多选两种模式。1. 创建列表列表的构造方法如书中表 8-29 所示。2. 常用方法列表的常用方法如书中表 8-30 所示。3. 事件响应列表可以产生两种事件:当用户单击列表中的某一个选项并选中它时,将产生 ItemEvent 类的选择事件;当用户双击列表中的某个选项时,将产生 ActionEvent 类的动作事件。如果希望对这两种事件都做出响应,就需要把列表分别注册给 ItemEvent 的监听者 ItemListener 和 ActionEvent 的监听者 ActionListener 。

Page 75: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.8 滚动条 (Scrollbar)滚动条( Scrollbar )是非常简单而常用的控制组件。一般,它有两个作用:一是将它作为滑块使用,用其代表的数据完成某些操作;另一方面是用它实现窗口的滚动。1. 创建滚动条滚动条的构造方法,例如:

Scrollbar mySlider = new Scrollbar(Scrollbar.HORIZONTAL ,0,1,0,Integer.MAX_VALUE);

其中的参数从左向右,依次代表为:滚动条方向: Scrollbar.HORIZONTAL 代表横向滚动条, Scrollbar.VERTICAL 代表纵向滚动条•滑块初始位置:为整数•滑块尺寸:一般为 1•滚动槽最小值:为整数•滚动槽最大值:为整数

Page 76: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.8 滚动条 (Scrollbar)2. 常用方法滚动条的常用方法如书中表 8-31 所示。3. 事件响应滚动条产生的事件为调整事件- AdjustmentEvent 。 AdjustmentEvent 类只包含一个事件一 ADJUSTMENT_VALUE_CHANGED 事件。调整事件是 GUI 组件状态发生连续变化产生的,引发这类事件的具体动作如下。( 1 )操纵滚动条,改变其滑块位置。( 2 )操纵用户自定义的 Scrollbar 的对象的子类组件,改变其滑块位置。

Page 77: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.9 画布 (Canvas)画布提供了一个空白 (背景色 ) 的空间。画布的空间可以用来绘图、显示文本、接收键盘或鼠标的输入。1. 创建画布Canvas 的构造方法没有参数,非常简单。例如:Canvas myCanvas=new Canvas();除非你用 setSize() 显式地定义它的大小,否则它的大小就是 0×0 。所以在创建 Canvas 对象后,应该调用 setSize() 方法确定画布的大小,否则将看不到它。2. 常用方法Canvas 的常用方法只有一个: public void paint(Graphic g) ,重载它就可以绘制图形。3. 事件响应画布可以“监听”所有适用于一个普通组件的事件。与 Applet 相似,它可以触发鼠标、键盘事件等。也就是说,可以利用 KeyListener 、 MouseMotionListener 和 MouseListener 中的方法,对用户的操作作出反应。

Page 78: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件8.6.10 对话框 (Dialog)对话框组件与一个 Frame (框架)相关联。它是一个带有一些装饰的自由窗口。它与框架的区别在于所提供的一些装饰,而且你可以生成一个模式对话框,它在被关闭前将存储所有窗口的输入。对话框可以是无模式和模式的。对于无模式对话框,用户可以同时与框架和对话框交互。模式对话框在被关闭前将阻塞包括框架在内的其他所有应用程序的输入。由于对话框是 Window (窗口)的子类,所以它的缺省布局管理器是 BorderLayout 。下面是一个创建对话框的例子:Dialog d = new Dialog(f, "Dialog", false);d.add(new Label("Hello, I'm a Dialog",Border.Layout.CENTER)); d.pack();

Page 79: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.10 对话框 (Dialog)对话框在创建时通常是不可见的。通常在对按下按钮等用户输入作出反应时,才显示对话框。例如:

public void actionPerformed(ActionEvent ev){d.setVisible(true);}

要隐藏对话框,可以调用 setVisible(false) 。关闭对话框的做法是对它添加一个 WindowListener ,并等待 windowClosing() 方法的调用。这和处理一个Frame 的关闭是相同的。

Page 80: 第 8 章  图形用户界面的设计与实现

8.6 8.6 常用标准组件常用标准组件

8.6.11 文件对话框 (FileDialog)文件对话框是使用文件操作时经常用的组件,例如打开、保存文件等。它有自己的自由窗口,以及窗口元素,并且允许用户浏览文件系统,以及为以后的操作选择一个特定的文件。下面是一个创建文件对话框的例子:FileDialog d = new FileDialog(parentFrame, "FileDialog");d.setVisible(true);String fname = d.getFile(); …通常并不需要处理 FileDialog 的事件。调用 setVisible(true) 将阻塞事件,直至用户选择 OK ,这时会请求用户选择一个文件名,作为一个 String返回。

Page 81: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

本节将介绍一个新的可以替代 AWT 的图形界面类 Swing 。 Swing 是 AWT 的扩展,它提供了更强大和更灵活的组件集合。除了我们已经熟悉的组件,如按钮、复选框和标签外, Swing还包括许多新的组件,如选项板、滚动窗口、树、表格等。除此之外, Swing 对原有的 AWT 组件,如按钮,增加了新功能。例如,按钮的状态改变时按钮的图标也可以随之改变。与 AWT 组件不同, Swing 组件实现了不包括任何与平台相关的代码。 Swing 组件是纯 Java 代码,因此与平台无关。一般用轻量级( lightweight)这个术语描述这类组件。

Page 82: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件 8.7.1 JApplet 类javax.swing.Japplet 是 java.applet.Applet 的子类。以下是一个实现了 Japplet小程序的简单例子,其使用方法与 Applet小程序相似。import javax.swing.*;import java.awt.*;public class MyFirstJApplet extends Japplet{ public void paint(Gaphics g) {

g.drawString(“我是一个 Japplet小程序” ,10,20);}

}与小程序配合使用的 HTML 文件和与 Applet小程序配合使用的 HTML 文件没有什么差别。 JApplet 与 Applet 的差别在于:Applet 的缺省布局策略是 FlowLayout, 而 JApplet 的缺省布局策略是 BorderLayout 。

Page 83: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.1 JApplet 类另外,向 JApplet 中加入 Swing 组件时不能直接用 add() 方法,而必须先使用 JApplet 的方法 getContentPane ()获得一个 Container 对象,再调用这个 Container 对象的 add() 方法将 JComponent及其子类对象加入到 JApplet 中。JComponent 类是所有 Swing GUI 组件的父类,这些 Swing GUI 组件可以被加入到 JApplet小程序中或是 Frame 容器中。基本上,对应每个 java.awt 组件,都存在一个 javax.swing 的“ J 组件”。例如,对应 Button ,存在 JButton;对应 Label ,存在 JLabel 。有些“ J 组件”与对应的 AWT 组件的功能和作用类似,有的则有很大改进。

Page 84: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.2 JFrame 类JFrame 类是直接从 Frame继承而来的。JFrame 类的重要方法如下:setIconImage—— 窗口最小化(在 Java 中称为图标化)时,把一个 Image 对象用作图标。setTitle—— 设置窗口中标题栏的文字。setResizable—— 设置用户是否可以改变框架大小。dispose 方法——关闭窗口,并回收该窗口的所有资源。setLocation—— 设置组件的位置。setBounds——重新设置组件的大小和位置。

Page 85: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.3 JLabel 类JLabel 的用法与 AWT 组件中的 Label 用法相似,都是用来显示一段文本,但是 Jlabel 可以显示图标。 JLabel 类的声明方式(构造方法)如下:JLabel lb1 = new JLabel();JLabel lb2 = new JLabel(icon);JLabel lb3 = new JLabel(icon,JLabel.CENTER);JLabel lb4 = new JLabel(“ 标签名称” ,icon,JLabel.CENTER);JLabel lb8 = new JLabel(“ 标签名称” );JLabel lb6 = new JLabel(“ 标签名称” ,JLabel.CENTER);其中 icon 代表加载的图标; JLabel.CENTER 代表对齐方式,其他对齐方式还有: JLabel.Bottom 、 JLabel.LEFT 、 JLabel.RIGHT 、 JLabel.TOP 等;双引号中的内容是标签的名称,可以自定义。

Page 86: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.3 JLabel 类在 Swing 中,图标由 ImageIcon 类封装,这个类负责将一个图片制成图标。ImageIcon 类的两个构造函数如下所示:ImageIcon(String filename)ImageIcon(URL url)第一个构造函数使用名为 filename 的文件中的图片。第二个使用资源定位符 url 所指示的图片。ImageIcon 类实现 Icon 接口,其方法书中表 8-33 所示。

Page 87: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.4 JTextField 类JTextField 用于编辑文本的内容。JTextField 类的声明方式(构造方法)如下:JTextField t1 = new JTextField();JTextField t2 = new JTextField(“Java”);JTextField t3 = new JTextField(10);JTextField t4 = new JTextField(“Java”,10);其中, 10 代表列数,” Java” 代表在 JTextField 中显示的内容。8.7.5 JPasswordField 类JPasswordField 类是 JTextField 类的子类。用户在 JPasswordField 对象中输入的字符会被其他的字符替代而遮住, JPasswordField 组件主要用来输入口令。

Page 88: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.6 JButton 类JButton 是一个按钮工具,与 AWT 类中 Button 组件用法类似,但是功能上增强了很多。JButton 对象除了可以像 Button 对象一样拥有文件标签之外,还可以拥有一个图标,这个图标可以是用户自己绘制的图形,也可以是已经存在的 .gif 图像。JButton 按钮不但可以拥有一个图标,而且可以拥有一个以上的图标,并根据 Swing 按钮所处状态的不同而自动变换不同的 Swing 按钮图标。在实际使用的许多按钮中,具有这样一种功能:当鼠标在按钮上停留很短的几秒钟时,屏幕上将会出现一个简短的关于这个按钮的作用的提示信息。使用 Swing 按钮可以很方便地实现这个加入提示的功能。

Page 89: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件 8.7.7 JCheckBox 类JCheckBox 与 CheckBox 所产生检查框非常类似。当鼠标按下 JCheckBox时,检查框会由“ false” 变成“ rue” 。若检查框任何一个选项被选取或取消选取, addItemListener() 将会送出一个事件,然后由 itemStateChanged() 方法接收处理此事件。JCheckBox 类的声明方式(构造方法)如下:

JCheckBox cb1=new JCheckBox();JCheckBox cb2=new JCheckBox(icon);JCheckBox cb3=new JCheckBox(icon,true);JCheckBox cb4=new JCheckBox(“One”);JCheckBox cb8=new JCheckBox(“One”,true);JCheckBox cb6=new JCheckBox(“One”,icon);JCheckBox cb7=new JCheckBox(“One”,icon,true);

其中” One” 代表检查框的名称; icon 代表检查框的图标; true 代表检查框的选取状态, true表示被选取, false表示未被选取。

Page 90: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件

8.7.8 JRadioButton 类JRadioButton 是选择按钮,与 JCheckBox 功能相似,所不同的是 JCheckBox 可以做多重选择,而 JRadioButton只能进行单一的选择。JRadioButton 类的声明方式(构造方法)和 JCheckBox类相同。单选按钮按下产生的行为事件,由 actionPerformed( )处理。 getActionCommand( ) 方法获取与单选按钮相关的文字,并用此文字设置文本域。

Page 91: 第 8 章  图形用户界面的设计与实现

8.7 Swing8.7 Swing 组件组件 8.7.9 JComboBox 类JComboBox 是下拉式列表框,用于列出多个选项供用户选择。 JComboBox每次只显示一个选项,若要看到所有的选项,则需要按下拉按钮。JComboBox 类的声明方式(构造方法)如下:

JComboBox cb1 = new JComboBox();JComboBox cb2 = new JComboBox(v);JComboBox cb3 = new JComboBox(o);

其中, v 代表向量,用来提供初始化下拉式列表框的条件。 O 代表加入下拉式列表框的对象。