Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

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

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

3 8.1 Java图形用户界面概述 图8-1 awt包中主要类之间的关系

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

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

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

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

8 8.2 标准组件 组件分类 图8-2 Component类的常用组件

9 8.2 标准组件 组件分类 图8-2 Component类的常用组件 图8-3 MenuComponent类的常用组件

10 8.2 标准组件 组件分类 图8-3 MenuComponent类的常用组件

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

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

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

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

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

16 8.2 标准组件 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)的区域

17 8.2 标准组件 8.2.4 Component类 public void setBackground(Color c):设置组件的背景色
8.2 标准组件 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():使组件获得焦点

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

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

20 8.3 简单图形用户界面 8.3.1 Frame与Panel 使用Frame窗口时将会用到的几个方法: 1.设置窗口大小
8.3 简单图形用户界面 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中存放着当前窗口的大小。

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

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

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

24 8.3 简单图形用户界面 字体设置 Java中用Font类来设置字体。一个Font类的对象表示了一种字体显示效果,包括字体类型、字型和字号。 Font类的构造方法如下: Font(String name,int style,int size); 其中,name代表字体名称,例如,可以是Helvetica、TimesRoman、Courier、宋体、楷体等。 style代表字体风格,有三种字体风格静态变量,即: Font.BOLD:黑体 Font.ITALIC:斜体 Font.PLAIN:正常字体

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

26 8.3 简单图形用户界面 8.3.2 字体设置 另外,Java提供了几种文字的输出方法:
8.3 简单图形用户界面 字体设置 另外,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方法来实现。该方法返回一个字符串数组,数组内包含所有可用的字体名。

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

28 8.3 简单图形用户界面 绘制简单图形 绘制线段 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表示多边形顶点的数目。

29 8.3 简单图形用户界面 绘制简单图形 绘制矩形 前面介绍的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为限制矩形图形范围左上角顶点的坐标。

30 8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.2 绘制矩形 3.drawRect()-用来绘制一个矩形。其语法如下:
8.3 简单图形用户界面 绘制简单图形 绘制矩形 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为绘制填满矩形的左上角顶点的坐标。 5.setClip()-用来设定限制图形范围的矩形。其语法如下: setClip(int x, int y, int w, int h); 其中x,y为设定限制图形范围矩形的左上角顶点的坐标。

31 8.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); arcw为圆矩形圆弧的宽度,arch为圆矩形圆弧的高度。

32 8.3 简单图形用户界面 8.3.3 绘制简单图形 8.3.3.4 绘制弧形 绘制弧形有drawArc()和fillArc()等方法。
8.3 简单图形用户界面 绘制简单图形 绘制弧形 绘制弧形有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); p为弧形的起始角度。 q为弧形的弧度。 q为正,表顺时针方向;q为负,表逆时针方向。

33 8.3 简单图形用户界面 绘制简单图形 绘制椭圆形 绘制椭圆形有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);

34 8.3 简单图形用户界面 设置颜色 绘图离不开颜色,图形中的颜色分前景色和背景色。显示的字符和图形的颜色用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所示 。

35 8.3 简单图形用户界面 8.3.4 设置颜色 对于GUI的控制组件,它们有四个与颜色有关的方法分别用来设置和获取组件的背景色和前景色:
8.3 简单图形用户界面 设置颜色 对于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)来创建一个颜色。

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

37 8.3 简单图形用户界面 显示图像 由于Java是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分是直接读取web服务器上的图像文件。 getImage()方法返回一个Image对象,它的调用格式为: Image getImage(URL url) Image getImage(URL ur1, String name) 其中url是一个URL类的对象,代表一个网络地址,例如我们访问搜狐网站服务器指定位置的一幅图片: getImage(new URL( drawImage()方法是Graphics类中用来显示图像的方法。它可以将Image对象关联的图像显示在Applet的指定位置。

38 8.3 简单图形用户界面 8.3.5 显示图像 drawImage()方法的调用格式如下:
8.3 简单图形用户界面 显示图像 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等。

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

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

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

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

43 8.4 Java事件处理 8.4.2 按钮点击事件 按钮是最常用到的组件,因此它的事件处理是非常重要的。 创建按钮的方法是:
按钮点击事件 按钮是最常用到的组件,因此它的事件处理是非常重要的。 创建按钮的方法是: Button MyButton = new Button(“Java”); 通过Container类的Add方法,将组件加入到该容器中。 class MyPanel extends Panel { public MyPanel() add(MyButton); }

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

45 8.4 Java事件处理 8.4.3 捕获窗口事件 Frame对象是窗口事件(WindowEvent)的事件源,要指定一个监听器对象:
捕获窗口事件 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); }

46 8.4 Java事件处理 捕获窗口事件 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窗口。

47 8.4 Java事件处理 键盘事件 键盘事件对应着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)

48 8.4 Java事件处理 8.4.4 键盘事件 Java对于用户按键的处理过程:
键盘事件 Java对于用户按键的处理过程: 当前键盘状态为小写状态,要输入一个大写字母“A”,我们的操作过程为:先按住Shift键不放,再按下A键,然后松开。整个过程Java会产生五个事件: 按下Shift键:为VK_SHIFT调用keyPressed方法; 按下A键:为VK_A调用keyPressed方法; 键入字符“A”:为字符“A”调用keyTyped方法; 松开A键:为VK_A调用keyReleased方法; 松开Shift键:为VK_SHIFT调用keyReleased方法。

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

50 8.4 Java事件处理 焦点事件 如果某个组件能够接收用户按键,那么该组件就拥有焦点。拥有焦点的组件在显示形式上与其他组件有一些差别:文本域内会显示光标;按钮四周会显示一个由虚线组成的矩形框。可以捕获丢失的焦点事件来进行输入的合法性检查。如果输入不合法,通过调用requestFocus方法把焦点重新移回到该文本域,提示用户重新输入: public void focusLost(FocusEvent event) { if(event.getComponent()==passText&&!event.isTemporary()) { //passText为需要进行合法性检查的文本域 if(!isFormatValid(passText.getText())) // isFormatValid为自定义方法,用户检查合法性 passText.requestFocus(); } Java支持的事件类型很多,书中表8-4列出了Java中各个事件类型、接口及相关方法。

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

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

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

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

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

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

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

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

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

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

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

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

63 8.6 常用标准组件 标签(Label) 一个标签对象显示一行静态文本。程序可以改变标签的内容,但用户不能改变。标签可以起到信息说明的作用,每个标签用一个Label类的对象表示。标签没有任何特殊的边框和装饰。 1.创建标签 标签的构造方法如书中表8-17所示。 例如,下面的语句在创建标签对象的同时说明了这个标签中的字符串: Label prompt=new Label (“请输入一个整数:”); 标签的属性如书中表8-18所示。

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

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

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

67 8.6 常用标准组件 文本区(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中回车,不会有事件产生。

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

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

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

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

72 8.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);

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

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

75 8.6 常用标准组件 8.6.8 滚动条(Scrollbar)
8.6 常用标准组件 滚动条(Scrollbar) 滚动条(Scrollbar)是非常简单而常用的控制组件。一般,它有两个作用:一是将它作为滑块使用,用其代表的数据完成某些操作;另一方面是用它实现窗口的滚动。 1.创建滚动条 滚动条的构造方法,例如: Scrollbar mySlider = new Scrollbar(Scrollbar.HORIZONTAL ,0,1,0,Integer.MAX_VALUE); 其中的参数从左向右,依次代表为: 滚动条方向:Scrollbar.HORIZONTAL代表横向滚动条,Scrollbar.VERTICAL代表纵向滚动条 滑块初始位置:为整数 滑块尺寸:一般为1 滚动槽最小值:为整数 滚动槽最大值:为整数

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

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

78 8.6 常用标准组件 对话框(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();

79 8.6 常用标准组件 对话框(Dialog) 对话框在创建时通常是不可见的。通常在对按下按钮等用户输入作出反应时,才显示对话框。 例如: public void actionPerformed(ActionEvent ev) { d.setVisible(true); } 要隐藏对话框,可以调用setVisible(false)。关闭对话框的做法是对它添加一个WindowListener,并等待windowClosing()方法的调用。这和处理一个Frame的关闭是相同的。

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

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

82 8.7 Swing组件 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。

83 8.7 Swing组件 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组件的功能和作用类似,有的则有很大改进。

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

85 8.7 Swing组件 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等;双引号中的内容是标签的名称,可以自定义。

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

87 8.7 Swing组件 8.7.4 JTextField类 8.7.5 JPasswordField类
JTextField t1 = new JTextField(); JTextField t2 = new JTextField(“Java”); JTextField t3 = new JTextField(10); JTextField t4 = new JTextField(“Java”,10); 其中,10代表列数,”Java”代表在JTextField中显示的内容。 JPasswordField类 JPasswordField类是JTextField类的子类。用户在JPasswordField对象中输入的字符会被其他的字符替代而遮住,JPasswordField组件主要用来输入口令。

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

89 8.7 Swing组件 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表示未被选取。

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

91 8.7 Swing组件 JComboBox类 JComboBox是下拉式列表框,用于列出多个选项供用户选择。JComboBox每次只显示一个选项,若要看到所有的选项,则需要按下拉按钮。 JComboBox类的声明方式(构造方法)如下: JComboBox cb1 = new JComboBox(); JComboBox cb2 = new JComboBox(v); JComboBox cb3 = new JComboBox(o); 其中,v代表向量,用来提供初始化下拉式列表框的条件。O代表加入下拉式列表框的对象。


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

Similar presentations


Ads by Google