Java 面向对象程序设计

89
Java 面面面面面面面面 面 6 面 面面面面面面

description

Java 面向对象程序设计. 第 6 章 图形用户界面. 第 6 章 图形用户界面. 6.1 Java 抽象窗口工具集 6.2 AWT 组件 6.3 容器 6.4 组件布局管理 6.5 事件处理 6.6 颜色和字体 6.7 颜色和字体 6.8 Swing 简介. 6.1 Java 抽象窗口工具集. - PowerPoint PPT Presentation

Transcript of Java 面向对象程序设计

Page 1: Java 面向对象程序设计

Java 面向对象程序设计

第 6 章 图形用户界面

Page 2: Java 面向对象程序设计

第 6 章 图形用户界面6.1 Java 抽象窗口工具集6.2 AWT 组件6.3 容器6.4 组件布局管理6.5 事件处理6.6 颜色和字体6.7 颜色和字体6.8 Swing 简介

Page 3: Java 面向对象程序设计

6.1 Java 抽象窗口工具集图形用户界面( Graphics User Interface , GUI ),是指用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面画面生动、操作简单,深受广大用户的喜爱和欢迎,已经成为目前几乎所有应用软件的既成标准。所以学习设计和开发图形用户界面,是应用软件开发员必修的一课。

Page 4: Java 面向对象程序设计

AWT ( Abstract Window Toolkit, 抽象窗口工具集)是 Java 语言提供的用户界面设计工具。 AWT的核心思想是把 GUI 看作是由一系列的组件 (Componetn) 构成,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮、一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器才可以显示出来。容器( Container )实际是 Component 的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其他组件和容器的功能。AWT 由 java.awt 包提供,该包中有许多用来设计用户界面的类和接口,用户在 JavaApplication 或 Applet 中进行 GUI 设计。

Page 5: Java 面向对象程序设计

AWT 组件相关类的层次关系如图 6.1 所示。

Applet

Choice

Object

Component

Dialog

Frame

CheckBox

Button

Label

Window

PanelContain

er

Page 6: Java 面向对象程序设计

设计和实现用户图形界面主要包括以下三个方面:

设计组件( Component ):包括设计 Java.awt 包中提供的组件和用户自定义的组件;

指定布局( Layout ):根据设计需要排列容器内各组件的位置;

设计响应事件( Event )。

Page 7: Java 面向对象程序设计

6.2 AWT 组件组件是构成 GUI 的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。组件一般作为一个对象放置在容器内,组件通过容器的 add 方法加入到容器中。抽象类 Component 作为 Java GUI 组件的共同父类,它规定了所有 GUI 组件的基本特性,该类中定义的方法实现了作为一个 GUI部件所应具备的基本功能,

Page 8: Java 面向对象程序设计

Component 类常用属性及对应操作方法属性名称 设置属性的方法 获取属性的方法 背景颜色 Void setBackground(Color) Color getBackground()

边界 void setBounds(Rectangle)voidsetBounds(int,int,int,int)

Rectangle getBounds()

可用性 void setEnabled(boolean) boolean isEnabled()

字体 void setFont(Font) Font getFont()

前景名 void setForeground(Color) Font getForeground(Color)

位置 void setLocation(Point)void setLocation(int ,int)

Point getLocation()Point getLocationOnScreen()

部件名称 void setName(String ) String getName()

尺寸 void setSize(Dimension Dimension getSize()

可见性 void setVisible(boolean) boolean getVisible()

Page 9: Java 面向对象程序设计

常用 AWT 组件 (1):组件名称 父类 说明

Button Component 可接收单击操作的命令按钮 Checkbox Component 复选框组件

Choice Component 下拉式列表框 Componen

t Object 抽象组件类

Container Component 抽象容器类 Dialog Window 对话框组件 Frame Window 基本的 Java GUI 窗口组件 Label Component 标签类 List Component 包含内容可变的条目的列表框组件

Page 10: Java 面向对象程序设计

Panel Container 基本容器类,不能单独停泊 Scrollbar Component 滚动条组件

TextComponent

Component TextField 和 TextArea 的基本功能

TextField TextComponent

单行文本框

TextArea TextComponent

多行文本框

Window Container 抽象的 GUI 窗口类,无布局管理器 MenuBar MenuCompon

ent 菜单条组件

MenuItem MenuComponent

菜单项组件

Menu MenuItem 菜单组件 PopupMenu Menu 弹出式菜单组件

常用 AWT 组件 (2):

Page 11: Java 面向对象程序设计

6.2.1 标签、文本框和命令按钮1 、标签标签的功能是显示单行的字符串,可在屏幕上显示一些提示

性,说明性的文字。如在文本框的旁边加上一个标签,说明文本框的功能。标签的构造方法有以下三种:

(1) Label() 该方法用来创建一个没有显示内容的对象;(2) Label(String str) 该方法用来创建一个显示内容为 str

的对象( 3 ) Label(String str, int alignment) 该方法除了用来创建一个显示内容为 Label 的对象外,还设置了 Label的对齐方式。 Label 的对齐方式有 LEFT 、 CENTER和RIGHT 来表示左对齐、居中和右对齐。

Page 12: Java 面向对象程序设计

标签的常用方法有:int getAlignment()返回当前的对齐方式;String getName()返回当前对齐的名字;String getText()返回当前对象显示的文本;void setAlignment(int align) 设置对齐方式;void setText(String str) 设置标签对象显示的

内容;

Page 13: Java 面向对象程序设计

2 、文本框Java 中用于处理文本的基本组件有两种:单行文本框 TextField 和多行文本区域 TextArea ,用来接受用户的键盘输入。TextField 的构造方法及常用方法有:

(1) TextField()创建一个默认长度的文本框;(2) TextField(int columns)创建一个指定长度的文

本框;(3) TextField(String text)创建一个带有初始文本

内容的文本框;(4) TextField(String text, int columns)创建个带

有初始文本内容并具有指定长度的文本框;

Page 14: Java 面向对象程序设计

(5) void setText(String text) 设定文本框的内容;

(6) void setEchoChar(char c) 设定用户输入字符的回显字符,例如输入用户口令时可设定回显字符为’ *’来屏蔽;

(7) String getText()获取文本框的内容;(8) void setEditable(boolean e) 设置文本框的可编辑性,默认为可编辑;

2 、文本框

Page 15: Java 面向对象程序设计

TextArea 类的构造方法及常用方法有: 1. TextArea()创建一个默认行数和列数的文本区;2. TextArea(int rows, int columns)创建一个 rows 行,

columns 列的文本区;3. TextArea(String text)创建一个带有初始文本内容的文本区;

4. TextArea(String text,int rows, int columns)创建文本区,初始字符串为 text ,行数为 rows ,列数为 columns 。

5. TextArea(String text,int rows,int clumns,int scrollbar) ,在上面文本区的基础上增加滚动条, scrollbar取值可以是: SCROLLBARS_HORIZONTAL_ONLY(仅有水平滚动条 ) 、 SCROLLBARS_VERTICAL_ONLY(仅有垂直滚动条)、 SCROLLBARS_BOTH(垂直,水平滚动条都有 ) 、 SCROLLBARS_NONE(没有滚动条 ) ;

Page 16: Java 面向对象程序设计

6 void setText(String text) 设置文本区的内容;7 String getText() 获取文本区的文本;8 void append(String str) 在文本区的尾部添加

文本;9 void insert(String str,int position) 在指定位置

插入文本;10 void setRows(int rows) 设定文本框的行数;11 int getRows() 返回文本区的行数;12 void setEditable(boolean b) 设定文本区的可

编辑状态。

Page 17: Java 面向对象程序设计

3 、按钮Button 类的构造方法及常用方法:(1) Button() 创建一个没有标题的按钮;(2) Button(String label) 创建一个有文字标

题的按钮;(3) String getLabel() 返回按钮的显示标题;(4) void setLabel(String label) 设置按钮上

显示的标题。

Page 18: Java 面向对象程序设计

设计程序运行结果如下图的 Applet

Page 19: Java 面向对象程序设计

6.2.2 单选框和复选框复选框( Checkbox )用于设置多重选择,可以让用户作出多项选择。

单选框又称为选项按钮,是一组按钮,用户只能从中选择一个。复选框和选项按钮的构造方法和主要方法如下 :(1) Checkbox()创建个没有标签的复选框;(2) Checkbox(“北京” )创建一个标签为“北京“的复选框;(3) CheckboxGroup()创建选项按钮。(4) String getLabel()返回复选框或单选按钮的标签;(5) CheckboxGroup getCheckboxGroup()返回单选按钮的复选框组;

(6) void setCheckboxGroup(CheckboxGroup g) 设置单选按钮所属的选项框组;

(7) boolean getState()返回复选框或单选按钮的选中状态;(8) void setState(Boolean state) 设置复选框或单选框的选

中状态;

Page 20: Java 面向对象程序设计

例 :设计程序运行结果如下图的 Applet

Page 21: Java 面向对象程序设计

6.2.3 下拉列表框和列表框1 、下拉列表框下拉列表框( Choice )是图形界面中提供选项的常用组件,

用户可以看到下拉列表框中的第一个选项和它旁边的箭头按钮,单击箭头按钮时,下拉列表框打开,用户可以在列表框中选择其他选项进行更改。其常用的方法有:

(1) void addItem(String item) 向列表框中添加选项 item ;(2) int countItem()返回列表框中的选项个数;(3) String getItem(int index)返回指定下标值的某个选项;(4) int getSelectedIndex() 返回被选中的选项的下标值;(5) String getSelectedItem()返回被选中的选项;

Page 22: Java 面向对象程序设计

(6) void select(int index)选择指定下标值的选项;

(7) void select(String item)选择指定的选项;

(8) void insert(String item, int index) 在下拉列表框中 index索引处插入名称为 item 的选项;

(9) void remove(int index)删除下拉列表框中 index索引处的选项;

(10) removeAll()删除下拉列表框中所有选项。

Page 23: Java 面向对象程序设计

2 、列表框 列表框( List )提供了多个文本选项,所有选项都是可见的,如果选项数目超出了列表框可见的范围,则列表框右边会出现个滚动条,同时,列表框支持多项选择。其构造方法与常用方法有:

(1) List()创建一个空列表框;(2) List(int rows)创建一个具有 rows 行的空列表框;

(3) List(int rows, boolean multiple)创建个 rows 行的空列表框, multiple值为 true ,则支持多重选择,否则只支持单项选择,默认为 false ;

(4) void delItem(int index)删除列表框中 index索引处的选项内容;

Page 24: Java 面向对象程序设计

(5) String getItem(int index)获取指定位置 index索引处的选项内容;

(6) String[] getItems()获取所有选项内容;(7) int getItemCount()获取列表框中共有

多少个选项(8) void replaceItem(String item, int ind

ex) 将 index 处位置的选项换成 item ;(9) void setMultipleMode(boolean b)b 为

true则允许多项选择,否则不允许。

Page 25: Java 面向对象程序设计

例 6.3 列表框应用实例 import java.awt.*;import java.applet.Applet;public class TestList extends Applet {

public void init(){Label label1=new Label(" 请选择系别: ");Label label2=new Label("中国名牌大学: ");Choice c=new Choice();c.add("计算机系 ");c.add(" 商学系 ");c.add(" 艺术系 ");c.add("机电系 ");c.addItem(" 信息管理系 ");c.insert("法律系 ",2);c.select(2);

Page 26: Java 面向对象程序设计

List l=new List(4);l.add(" 北京大学 "); l.add(" 清华大学 ");l.add(" 复旦大学 "); l.add(" 浙江大学 ");l.add("中国海洋大学 ");l.setMultipleMode(true);add(label1); add(c);add(label2);add(l);

}}程序运行结果如右图所示:

Page 27: Java 面向对象程序设计

6.3 容器容器是用来组织其他界面成份和元素的单元。一般说来一个应用程序的图形用户界面对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面元素,这些界面元素本身也可以是另外一个容器,这个容器再进一步包含它的界面元素,依次类推就构成一个复杂的图形界面系统。

Page 28: Java 面向对象程序设计

容器的主要作用和特点如下:容器有一定范围:一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记;容器有一定的位置:这个位置可以是屏幕四角的绝对位置,也可以是相对于其他窗口边框的相对位置;容器中可以包含其他的许多界面成分和元素:当容器被打开显示时,它上面的所有元素也同时显示出来,当容器被关闭和隐藏时,它所包含的元素也一起被隐藏;容器可以按一定的规则来物理地安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。

Page 29: Java 面向对象程序设计

Java 中 GUI 提供两种主要的容器类型: Panel 类和 Window 类。这两个类都是抽象类。Window 类是可自由停泊的顶层窗口, Window 类的两个重要子类是框架类( Frame )和对话框类( Dialog ),这两个类者有边框,并且都可以移动、放大、缩小和关闭功能的容器; Panel 类是可作为容器容纳其他组件的非顶层容器,它不能独立存在,必须被添加到其他容器中(如 Window 或 Applet )。

Page 30: Java 面向对象程序设计

从 Component 类继承的下述成员方法:

public setLocation(int x,int y) :移动当前组件到一个新的位置;public setSize(int width,int height) :重新设置组件大小;public setBounds(int x,int y,int width,int height) :移动并重置当前组件大小。

Page 31: Java 面向对象程序设计

6.3.1 Frame 类 抽象 Window 类不能实例化,实际程序中经常使用的是其子类 Frame 。 Frame 对象显示效果是一个窗口,带有标题,可以由用户重置其大小。在其构造方法中通过 String参数指定窗口标题, Frame 对象默认尺寸为 0×0像素且不可见,可使用 setSize()方法设置窗口大小,使用 setVisible(true)方法使之变为可见。 Frame默认的布局管理器是 BorderLayout ,可使用 setLayout() 方法改变其默认布局管理器。

Page 32: Java 面向对象程序设计

例:import java.awt.*;public class TestFrame {

public static void main(String[] args) {Frame f=new Frame("My Frame Test");f.setSize(200,150);f.setBackground(Color.BLUE );f.setVisible(true);

}}

Page 33: Java 面向对象程序设计

程序运行结果如图所示:

Page 34: Java 面向对象程序设计

6.3.2 Panel 类Panel 类可以容纳其他组件,在程序中经常用于布局和定位,它可以采用与所在容器不同的布局管理器, Panel 对象默认的布局管理器是 FlowLayout ,也可使用 setLayout() 方法改变其默认布局管理器。

Page 35: Java 面向对象程序设计

例:import java.awt.*;public class TestPanel {

public static void main(String[] args) {Frame f=new Frame("My Frame with Pa

nel");Panel p=new Panel();f.setSize(180,120);f.setBackground(Color.BLUE );f.setLayout(null); // 取消布局管理器p.setSize(120,60);p.setBackground(Color.GREEN );f.add(p);f.setVisible(true);

}}

Page 36: Java 面向对象程序设计

程序运行结果如图 6.6 所示:

Page 37: Java 面向对象程序设计

本讲小结 :

本讲首先介绍了 AWT (抽象窗口工具集)的概念,接着讲述了 Java 中的基本组件:标签、文本框、命令按钮、单选框、复选框、下拉列表框和列表框,最后介绍了 Frame 类和 Panel 类两个容器类的使用。

Page 38: Java 面向对象程序设计

6.4 组件布局管理为了使我们生成的图形用户界面具有良好的平台无关性, Java 语言提供了布局管理器这个工具来管理组件在容器中的位置,而不使用直接设置组件位置和大小的方式。每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,会就调用其对应的布局管理器。Java 语言中包含的容器布局管理器有: FlowLayout 、 BorderLayout 、 GridLayout 和 CardLayout 。

Page 39: Java 面向对象程序设计

6.4.1 FlowLayout 布局管理器FlowLayout (顺序布局)是最基本的一种布局,是 Panel 面板及其子类 Applet 的默认布局方式,前面介绍的例子都使用了默认的顺序布局。这种布局方式将组件依次逐行定位,行内从左到右顺序排列,一行排满后就转到下一行继续排列,直到把所有的组件都显示出来。 FlowLayout 布局默认对齐方式为居中对齐,不改变组件的大小,按组件原有尺寸显示组件。在顺序布局方式下,由于功能有限,不能很好地控制组件的排列,所以常用在组件较少的情况下,组件较多时,可以使用容器的 setLayout 方法改变组件布局方式。

Page 40: Java 面向对象程序设计

6.4.2 BorderLayout 布局管理器BorderLayout (边界布局)是 Window 、 Frame 和 Dialog 的默认布局管理器。 BorderLayout 把容器分为 5 个区: North (北区)、 South (南区)、 East (东区)、West (西区)和 Center (中区)五个区域,其方位依据“上北下南,左西右东”的规则,组件只能添加到指定的区域。如不指定组件的加入部位,则默认加入到 Center区域。每个区域只能加入一个组件,如加入多个,则先前加入的组件会被遗弃。与 FlowLayout 不同,在使用 BorderLayout 布局管理器容器中,组件尺寸也被布局管理器强行控制,即组件与其所在区域的尺寸相同。当 BorderLayout型布局容器的尺寸发生变化时,其中各组件的相对位置保持不变,组件的尺寸会随所在区域进行缩放调整。

Page 41: Java 面向对象程序设计

例: import java.awt.*; import java.applet.Applet; public class TestBorderLayout extends Applet { Button bN,bS,bW,bE,bC;

public void init(){ BorderLayout layout=new BorderLayout();

setLayout(layout); bN=new Button("North"); bS=new Button("South"); bW=new Button("West"); bE=new Button("East"); bC=new Button("Center"); add(bN,"North"); add(bS,"South"); add("West",bW); add("East",bE); add("Center",bC);

}}

Page 42: Java 面向对象程序设计

程序运行结果如图 6.7 所示:

Page 43: Java 面向对象程序设计

6.4.3 GridLayout 布局管理器GridLayout (网格布局)管理器将容器区域划分成规则的若干矩形网格,每个单元格区域大小相同,每个网格可以放置一个组件,组件添加到网格中时 ,先从左到右添满一行后换行,再从上到下。与 BorderLayout 布局类型一样, GridLayout型布局中的组件大小被布局管理器强行控制,与网格同等大小,当容器尺寸发生变化时,其中的组件相对位置不变,但大小发生变化。创建网格布局管理器时,可以给出网格的行数和列数。

Page 44: Java 面向对象程序设计

例: import java.awt.*;import java.applet.Applet;public class TestGridLayout extends Applet {

Button b1,b2,b3,b4,b5,b6,b7,b8;public void init(){

setLayout(new GridLayout(3,4));b1=new Button("button1");b2=new Button("button2");b3=new Button("button3");b4=new Button("button4");b5=new Button("button5");b6=new Button("button6");b7=new Button("button7");b8=new Button("button8");add(new Label("第一格 "));add(b1); add(b2);add(b3); add(b4);add(new Label("label"));add(b5); add(b6);

add(b7); add(b8); }}

Page 45: Java 面向对象程序设计

程序运行结果如图 6.8 所示:

Page 46: Java 面向对象程序设计

6.4.4 CardLayout 布局管理器

CardLayout(卡片布局 ) 管理器能够帮助用户处理两个以至更多的组件成员共享同一显示窨,将组件像卡片一样前后依次排列,这种布局在一张卡片中只显示一个组件,因此需要使用某种方法翻阅这些卡片。

Page 47: Java 面向对象程序设计

使用 CardLayout 布局常用到以下三个方法:

first() :显示布局设置为 CardLayout 的容器中的第一张卡片;

last() :显示布局设置为 CardLayout 的容器中的最后一张卡片;

next() :显示当前卡片的下一张卡片

Page 48: Java 面向对象程序设计

例:import java.awt.*;import java.applet.Applet;public class TestCardLayout extends Applet {

CardLayout card=new CardLayout(); // 先创建一个卡片布局管理器对象

public void init(){setLayout(card); // 设定容器的布局方式setFont(new Font(" 隶书 ",Font.ITALIC +Font.BOLD ,26));

// 设置字体for(int i=1;i<6;i++){

add(String.valueOf(i),new Label(" 卡片号为: "+i));}//card.show(this,String.valueOf(3)); // 显示卡片号为 3 的

卡片//card.show(this,"1"); // 显示第 1 张卡片card.last(this ); // 显示最后一张卡片,即卡片号为 5 的卡片card.next(this); // 显示下一张卡片

}}

Page 49: Java 面向对象程序设计

程序的运行结果如图 6.9所示:

Page 50: Java 面向对象程序设计

6.4.5 手工布局Java 还允许用户取消容器的默认布局,手工放置各个组件,这种方法比较灵活。如:

import java.awt.*; import java.applet.Applet; public class TestLayoutNull extends Applet {

Label lbl=new Label("手工布局的例子 ");TextField txt=new TextField(20);Button btn=new Button("test");Button ok=new Button("确定 ");public void init(){

setLayout(null);// 取消默认布局,采用手工布局setBackground(Color.BLUE );add(lbl);lbl.setBounds(20,20,100,30);lbl.setBackground(Color.YELLOW );add(txt);txt.setBounds(20,60,60,20);add(btn);btn.setBounds(100,60,30,20);add(ok);ok.setBounds(80,100,30,20);

}}

Page 51: Java 面向对象程序设计

程序运行结果如图 6.10所示:

Page 52: Java 面向对象程序设计

本讲小结:

本讲主要讲述了 Java 中常用的布局管理器: FlowLayout 顺序布局管理器、 BorderLayout 边界布局管理器、GridLayout 网络布局管理器、 CardLayout 卡片布局管理器和手工布局的使用。

Page 53: Java 面向对象程序设计

6.5 事件处理事件处理技术是 Java 用户界面设计中一个十分重要的技术。用户在图形用户界面中输入命令是通过移动鼠标或单击单击特定界面元素来实现的。为了能够接受用户的命令,界面系统首先应该能够识别这些鼠标或键盘的操作并作出相应的反应。通常一个键盘或鼠标的操作会激发一个系统预先定义好的事件,用户只需要设计程序代码定义每个特定事件发生时所对应的响应操作。这些程序代码将在它们对应的事件发生时由系统自动调用。在前面编写的程序中,对按钮等组件进行单击操作,都没有什么反应,就是因为没有为事件编写相应的处理程序。 Java.awt.event 包中包含了许多用来处理事件的类和接口。

Page 54: Java 面向对象程序设计

6.5.1 Java 事件处理基本概念 1 、事件( Event ) 是系统在捕获用户界面操作过程中产生

的代表相应操作的一个数据结构,是用户操作在 Java 系统内的数字表达,它描述了发生了什么事情。用户与用户界面上的组件交互是通过响应各种事件来实现的,如用户单击了一个命令按钮,意味着一个按钮事件 的发生。

2 、事件源( Event Source )产生事件的组件,如按钮、文本框等。

Page 55: Java 面向对象程序设计

3 、监听器( Listener ) 是调用事件处理方法的对象,它对事件源能够进行监听,以便对事

件源所发生的事件做出相应的处理。事件源通过调用相应的方法将某个对象作为自己的监听器,如文本框可以调用以下方法注册监听器:

addActionListener(监听器 );4 、事件注册 事件源为了将其上产生的事件传递给监听器接受并处理,应该提供注册和注销事件监听器的方法。这些方法必须遵循下面的设计格式:

public void add<ListenerType>(<ListenerType> Listener) 注册监听器便利该事件源上发生的事件能够被监听器 Listener 接收

并处理。如上面调用的方法 addActionListener()就是一个事件注册方法。

public void remove<ListenerType>(<ListenerType> Listener) 注销监听器便利监听器 Listener 不能监听到该事件源上发生的事件。

Page 56: Java 面向对象程序设计

5 、监听器接口(事件处理方法) 是能够接收、解析和处理事件类对象、实

现和用户交互的方法。监听器是一个对象,为了处理事件源发生的事件,监听器会自动调用一个方法来处理事件。 Java规定:为了使监听器能够对事件源所发生的事件做出处理,创建该监听器的类必须声名实现相应的接口,即必须在类体中给出该接口中所有方法的方法体。那么当事件源发生事件时,监听器就会自动调用执行被类实现的某个接口方法。

Page 57: Java 面向对象程序设计

6.5.2 事件处理方法每当一个事件发生, Java虚拟机就会将事件的消息传递给程序,由程序中的事件处理方法对事件进行处理。如果没有编写事件处理方法,程序就不能和用户交互,前面的程序因为没有编写事件处理方法,所以虽然 Java虚拟机通知程序发生了按钮单击事件,但程序中因为没有相应的事件处理方法,把事件忽略了。

Page 58: Java 面向对象程序设计

6.5.3 事件处理实例1 、单击按钮事件例:import java.awt.*;import java.awt.event.*;import java.applet.Applet;public class Addition extends Applet implements ActionLis

tener {Label label1=new Label("+");Label label2=new Label("=");TextField txt1=new TextField(6);TextField txt2=new TextField(6);TextField txt3=new TextField(8);Button btn=new Button("相加 ");

Page 59: Java 面向对象程序设计

public void init(){add(txt1);add(label1);add(txt2);add(label2);add(txt3);add(btn);btn.addActionListener(this); //注册监听器

}public void actionPerformed(ActionEvent e){

int x=Integer.parseInt(txt1.getText()); //把获取文本框中的数据并转换为整型

int y=Integer.parseInt( txt2.getText() );txt3.setText(Integer.toString(x+y));

}}

Page 60: Java 面向对象程序设计

首先需要导入事件处理的 event 包,在类Addition声明继承自 Applet 的同时,引入了一个单击事件监听器 ActionListener接口,在程序运行期间可监听发生了什么事件,并负责调用相应的事件处理方法作出响应。在类 Addition 中实现了接口中的方法 actionPerformed() ,对按钮单击事件作出了相应的处理。

Page 61: Java 面向对象程序设计

程序运行结果如图 6.11 所示 :

Page 62: Java 面向对象程序设计

2 、选项事件处理import java.awt.*;import java.awt.event.*;import java.applet.Applet; public class ItemEventDemo extends Applet implements ItemLis

tener{Label label1=new Label("爱好: ");Label label2=new Label("性别: ");String aihao[]={"足球 ","篮球 ","上网 ","购物 ","钓鱼 "," 小说 ","音乐 "};Checkbox cb[]=new Checkbox[7];CheckboxGroup group=new CheckboxGroup();Checkbox male=new Checkbox("男 ",group,true);Checkbox female=new Checkbox("女 ",group,false);TextArea ta=new TextArea(6,30);

Page 63: Java 面向对象程序设计

public void init(){add(new Label("你的选择是: "));add(ta);add(label1);for(int i=0;i<7;i++){

cb[i]=new Checkbox(aihao[i]);add(cb[i]);cb[i].addItemListener(this);

}add(label2);add(male);add(female);male.addItemListener( this);female.addItemListener( this);

}public void itemStateChanged(ItemEvent e){

ta.append("你选择了: "+e.getItem()+"\n");}

}

Page 64: Java 面向对象程序设计

程序运行结果如图 6.12 所示:

Page 65: Java 面向对象程序设计

3 、多重监听器

由于事件源可以产生多种不同类型的事件,因而可以注册(触发)多种不同类型的监听器。需要注意以下两点:

1. 针对同一事件源的同一种事件也可以注册多个监听器。

2. 同一个监听器对象可以被同时注册到多个不同的事件源上。

Page 66: Java 面向对象程序设计

例: import java.awt.*;import java.awt.event.*;import java.applet.Applet;public class TestMultiListener extends Applet implements MouseListener,

MouseMotionListener {TextField tf=new TextField(30);Label lbl=new Label(" 请按下鼠标进行划线 ");int x1,y1,x2,y2;public void init(){

addMouseListener(this);addMouseMotionListener(this);setLayout(new BorderLayout());add(lbl,"North");add(tf,"South");

}public void mouseEntered(MouseEvent e){

tf.setText("鼠标已进入 Applet");}public void mouseExited(MouseEvent e){

tf.setText("鼠标已离开 Applet");}

Page 67: Java 面向对象程序设计

public void mouseClicked(MouseEvent e){}public void mousePressed(MouseEvent e){

x1=e.getX() ;y1=e.getY() ;tf.setText("鼠标当前位置是( "+x1 +","+y1 +")");

}public void mouseReleased(MouseEvent e){}public void mouseDragged(MouseEvent e){

x2=e.getX();y2=e.getY();repaint();

}public void mouseMoved(MouseEvent e ){}public void paint(Graphics g){

g.drawLine(x1,y1,x2,y2);}

}

Page 68: Java 面向对象程序设计

本程序可以使用鼠标画线。首先在起点位置按下鼠标,此时将发生一个 mousePressed 事件,所以,程序中使用了mouseListener 接口,在相应的处理方法中,将鼠标位置保存 x1 和 y1 中。拖拽鼠标时,将连续发生 mouseDragged 事件,所以,程序使用了mouseMotionListener 接口,在这个事件接口的处理方法中,另一鼠标位置被保存到 x2 和 y2 ,然后调用 repaint() 方法重画直线。只要确定起点坐标和终点坐标,即可使用图形对象画线的方法 g.drawLine(x1,y1,x2,y2)画出直线。鼠标的位置是由 mouseEvent 类的方法 e.getX() 和 e.getY()得到的。这样,鼠标不断移动,直线不断被重画出来,最后放开鼠标,直线就固定下来了。addMouseListener() 和 addMouseMotionListener() 语句前面没有组件对象,表示事件源为整个容器,即对所有的区域进行监控。

Page 69: Java 面向对象程序设计

6.5.4 事件适配器为简化编程,针对大多数事件监听器接口定义了相应的实现类,即事件适配器类 Adapter 。在 Adapter 类中,实现了相应监听器接口中所有的方法,但都是空方法,不做任何事情。然后程序员在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。

Page 70: Java 面向对象程序设计

一个事件适配器类 WindowAdapter 的定义:

Public abstract class WindowAdapter implements WindowListener{public void windowOpened(WindowEvent e){}public void windowClosing(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}

}

Page 71: Java 面向对象程序设计

常用的事件适配器类有:     ComponentAdapter( 组件事件适配器 ) ContainerAdapter( 容器事件适配器 ) FocusAdapter( 焦点事件适配器 ) KeyAdapter( 键盘事件适配器 ) MouseAdapter( 鼠标事件适配器 ) MouseMotionAdapter( 鼠标移动事件适配器 ) WindowAdapter( 窗口事件适配器 )

Page 72: Java 面向对象程序设计

例:事件监听器接口和适配器的对比

import java.awt.*;import java.awt.event.*;public class TestListener {

public static void main(String[] args) {Frame f=new Frame("Java WindowTest");f.setSize(200,150);MyListener listener=new MyListener();f.addWindowListener(listener);f.setVisible( true);

}}

Page 73: Java 面向对象程序设计

class MyListener implements WindowListener{public void windowOpened(WindowEvent e){}public void windowClosing(WindowEvent e){

System.exit(1);}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}}

Page 74: Java 面向对象程序设计

程序运行时,用户鼠标单击其 GUI 窗口右上角的关闭按钮可以关闭窗口,退出当前程序。其中, System 类的exit(int status) 方法可以终止当前正在运行的 Java 虚拟机。参数 satus取值为 0 表示 JVM正常结束,非 0表示非正常结束。

Page 75: Java 面向对象程序设计

6.5.5 内部类和匿名类在 Java 事件处理中的应用

为了更好的加强类之间的联系,在 Java 中可以把一个类声明为另一个类的成员,这样的类称为被包容的类。被包容的类可以无条件地使用包容它的类的所有成员,包括私有成员。和其他类成员一样,被包容的类可以被声明为静态类,非静态被包容的类称为内部类。

Page 76: Java 面向对象程序设计

例如:内部类的使用import java.awt.*;import java.awt.event.*;public class TestInnerClass {Frame f=new Frame("TestInnerClass");public TestInnerClass(){

MyInner m=new MyInner();f.addWindowListener(m);f.setSize(200,150);f.setVisible(true);

} public static void main(String[] args) {new TestInnerClass();

}class MyInner extends WindowAdapter{

public void windowClosing(WindowEvent e){System.exit(1);

}}

}

Page 77: Java 面向对象程序设计

例:内部匿名类的使用

import java.awt.*;import java.awt.event.*;public class TestInnerClass2 {Frame f=new Frame("TestInnerClass");public TestInnerClass2(){

f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){

System.exit(1);}

});f.setSize(200,150);f.setVisible(true);

}public static void main(String[] args) {

new TestInnerClass();}

}

Page 78: Java 面向对象程序设计

本讲小结 :

本讲主要讲述了 Java 事件处理的基本概念 , 事件处理的基本方法 ,详细介绍了单击按钮事件 , 选项事件的处理方法 , 最后介绍了事件适配器 , 内部类 ,匿名类在事件处理中的应用 .

Page 79: Java 面向对象程序设计

6.6 颜色和字体

Java 程序的图形用户界面和图形输出都可以设置不同的图形颜色,颜色的获取可以通过创建一个 Color类对象来实现,而各个组件颜色可以通过调用 setColor() 和 setBackground() 等方法来实现。

Page 80: Java 面向对象程序设计

6.6.1创建 Color 类对象创建 Color 类对象有两种方法,原理都是利用三元色可以

构造任何一种颜色,具体形式如下:Color(int r,int g,int b) 其中每个参数的值都在 0~255 之间。数值越大就表明这种颜色的成分就越重,如( 0,0, 0)表示黑色,而( 255 , 255 , 255 )表示白色。

Color(int rgb) 指定一个三颜色的混合值,用 24 位二进制数来表示,其中 0~7 位表示蓝色, 8~15 位表示绿色,16~23 位表示红色。在 Color 类中还定义了一些标准的颜色常量(都是静态成员),如 red表示红色, black表黑色, white表示白色, green表示绿色等。

Page 81: Java 面向对象程序设计

6.6.2 创建 Font 对象在 Java 中提供了一个 Font 类,利用它可以定义文

本的字体、风格及字号大小。构造方法如下:Font(String fontName,int style,int size)其中第 1 个参数为字体名称,如“宋体”、“黑

体”等;第 2 个参数表示字体风格,如 Font.BOLD(加粗 ) 、 Font.ITALIC(斜体 ) 等;第 3 个参数表示字体大小。如:Font(“TimesRoman”,Font.BOLD+Font.ITALI

C,18)

Page 82: Java 面向对象程序设计

6.7 菜单菜单是图形用户界面的重要组成部分,由菜单条( MenuBar ) 、 菜 单 ( Menu ) 、 菜 单项( MenuItem )和带复选框的菜单项( CheckboxMenuItem )等对象组成。使用 AWT 菜单的一般步骤为:

( 1 ) 创建一个 MenuBar 对象,并将其置于一个可容纳菜单的容器(如 Frame )中。

( 2 ) 创建一个或多个 Menu 对象,并将它们添加到先前创建的MenuBar 对象中。

( 3 ) 创建一个或多个MenuItem 对象,再将其加入到各Menu 对象中。

Page 83: Java 面向对象程序设计

例:为窗口加入菜单

import java.awt.*;import java.awt.event.*;Public class TestMenu implements ActionListener,ItemListener{Frame f=new Frame("Test Menu");MenuBar mb=new MenuBar();Menu m1=new Menu("File");Menu m2=new Menu("Format");Menu m3=new Menu("Help");Menu mi1=new Menu("Style");Menu mi2=new Menu("Color");CheckboxMenuItem item1=new CheckboxMenuItem("加粗 ");CheckboxMenuItem item2=new CheckboxMenuItem("斜体 ");MenuItem item3=new MenuItem("red");MenuItem item4=new MenuItem("blue");Label lbl=new Label("欢迎进入 Java世界 ");

Page 84: Java 面向对象程序设计

public TestMenu() {f.setMenuBar(mb); //显示菜单条mb.add(m1); //将菜单加入到菜单条中mb.add(m2);mb.setHelpMenu(m3);m2.add(mi1);m2.add(mi2);mi1.add(item1); //将菜单项加入到菜单中mi1.add(item2);mi2.add(item3);mi2.add(item4);f.add(lbl);item1.addItemListener(this); //注册监听器item3.addActionListener( this);f.setSize(300,250);f.setVisible(true);

}

Page 85: Java 面向对象程序设计

public void actionPerformed(ActionEvent e){lbl.setForeground(Color.RED );

}public static void main(String args[]){

new TestMenu();}public void itemStateChanged(ItemEvent e){

if(e.getSource()==item1){if(item1.getState() ){lbl.setFont(new Font("宋体 ",Font.BOLD ,24 ));}else{lbl.setFont(new Font("宋体 ",Font.PLAIN,24 ));}

}}

}

Page 86: Java 面向对象程序设计

程序运行结果 :

Page 87: Java 面向对象程序设计

JApplet 需要自建容器以便把组件添加到容器对象中,默认布局为边界布局。程序首先定义了容器对象 pane ,并在 init 方法中调用 getContentPane 方法创建了这个容器对象,这样才能将其他组件回到到 JApplet 中。然后创建了 2 个面板对象并指定顺序布局,创建了 3 个按钮对象并通过 ImageIcon 生成按钮图标。最后创建了一个既有文字又有图标的标签对象,指定标签位置在显示区的中心,文字紧跟在图标后面。Swing 按钮除了可以显示图像外,还可以显示文字提示,程序调用了 setToolTipText 方法分别为每个按钮设定了文字提示,这样,当鼠标指向按钮时就会显示出文字提示。在其他方面,如设定颜色、设定布局方式、添加组件以及组件事件响应等, JApplet 和 Applet没有在的差别。

Page 88: Java 面向对象程序设计

6.8 Swing 简介Java 的另一种图形编程接口是 Swing , Swing比AWT 功能更强。 javax.swing 包中有四个重要类:JComponent 、 JApplet 、 JFrame 和 JDialog 。Swing 和 AWT 的最大差别在于 Swing 组件类不带本地代码,因此不受操作系统平台的限制,具有比AWT 组件更强的功能。需要注意的是,不能在 Swing 的顶层容器如 JApplet 、 JFrame 中直接加入组件,例如,在 JApplet 中不能直接调用 add 方法加入组件,而应调用 JApplet 的 getContentPane方法获得一个容器,再调用这个容器的 add 方法来加入组件。

Page 89: Java 面向对象程序设计

本讲小结 :

本讲主要讲述了颜色和字体的设置方法,如何在窗口中添加菜单和使用菜单,以及简单的 Swing 组件的使用。