Version 3.0
GUI 编程第六章
2
回顾
运行时发生的错误称为异常。
Java 使用 try 和 catch 块来处理异常。 try 块中的语句引发异常,而 catch 块则处理异常。
可以同时使用多个 catch 块来分别处理各种异常类型。
关键字 throws 用于列出一个方法可能引发的异常类型。
Java 中的垃圾收集就是将分配给对象但不再使用的内存回收或释放的过程。
3
目标
了解 AWT 包及其组件
掌握如何创建 GUI 程序
掌握 AWT 组件的基本用法
掌握如何使用布局管理器构造复杂的布局
4
抽象窗口工具包
图形用户界面 (GUI)可以通过键盘或鼠标来响应用户的操作。
抽象窗口工具包 (AWT)是一组 Java类,此组
Java类允许创建图形用户界面 (GUI)。
AWT提供用于创建生动而高效的 GUI的各种组件 。
5
java.awt 包中的类体系结构
Component
Button Checkbox Container Choice Canvas
TextComponent
Label
Panel Window
Applet Frame Dialog
TextArea TextField
6
容器
可以存放组件的区域,可在容器上进行绘制和着色
java.awt包中的 Container类可直接或间接派生出两个常用容器:框架( Frame类)
和面板( Panel类)。
框架是一个带有边框的独立的窗口。
面板是包含在窗口中的一个不带边框的区域。
7
容器 – 框架
框架是独立于 Applet和浏览器的一个窗口。
可以通过以下任一构造函数来创建:
– Frame():创建一个不含标题的标准窗口
– Frame(String Title),创建一个含有标题的窗口,
这个标题是由参数 title指定的。
当一个 Frame窗口被创建以后,需要调用
setSize()方法来设置窗口的大小,并调用
setVisible()来显示窗口。
8
容器 - 面板
面板不是一个单独的窗口,它只是包含在窗口中的一个区域。
面板是可以将许多组件组合起来的一种容器。
最简单的创建面板的方式就是通过面板的构造函数 Panel() 来进行。
必须将面板添加到窗体中。
9
使用容器示例
import java.awt.*;
class PanelTest extends Panel {
public static void main(String args[]) {
PanelTest p= new PanelTest();
Frame f=new Frame("正在测试面板 ! ");
f.add(p);
f.setSize(300,200);
f.setVisible(true);
}
}
使用 GUI组件必须导入该包将面板添加到框架窗体中
10
AWT组件
组件指可以放置在用户界面上的任何东西,
可以将组件设置为可见或重新调整其大小。
AWT支持的组件:标签、文本域、文本区、
按钮、复选框、选择框等。
高级组件包括滚动条、滚动窗格和对话框。
向窗口加入一个组件:首先生成所需组件的实例,然后调用 add()方法,此方法是在
Container类中定义的。
11
不同组件标签文本域复选框单选按钮文本区按钮
12
标签
可以通过以下任一构造函数来创建:
– Label( ),新建一个空标签
– Label(String labeltext),新建一个包含给定文本的标签
– Label(String labeltext,int alignment),新建一个包含给定对齐方式的标签,对齐方式可以为
Label.LEFT,Label.RIGHT 或 Label.CENTER
通常用来指明项目的用途
标签不可以被用户编辑
13
文本域
可以通过以下任一构造函数来创建:
- TextField(),新建一个文本域
- TextField(int columns),新建一个包含给定列数的文本域
- TextField(String s),新建一个包含给定字符串的文本域
- TextField(String s,int columns),新建一个包含给定字符串和列数的文本域
一种用来输入文本的 GUI组件
只能接受一行输入
14
标签和文本域使用示例
import java.awt.*;
class TextLabelDemo extends Frame {
Label lblName=new Label(“名称,” );
TextField txtName=new TextField(20);
public TextLabelDemo (String title) {
super(title);
setLayout(new FlowLayout());
add(lblName);
add(txtName);
}
public static void main(String args[]) {
TextLabelDemo t=new TextLabelDemo("正在测试组件 ! ");
t.setSize(300,200); t.show();
}
}
新建一个标签新建一个文本域添加到窗口
15
文本区
可以通过以下构造函数来创建:
- TextArea( ),新建一个 TextArea
- TextArea(int rows,int cols),新建一个包含给定行数和列数的 TextArea
- TextArea(String text,int rows,int cols),新建一个包含给定字符串、行数和列数的 TextArea
要接受输入多行文本时使用
可以包括滚动条
.,,
TextArea txtComment=new TextArea();
add(txtComment);
.,,
16
按钮
可以使用以下任一构造函数来创建按钮:
- Button(),新建一个空的按钮
- Button(String text),新建一个包含给定字符串的按钮
按钮是任何 GUI都 不可或缺的组件
用来捕捉用户操作的最为简便的方式
.,,
Button btnOk=new Button("确定 ! ");
Button btnCancel=new Button("取消 ! ");
add(btnOk);
add(btnCancel);
.,,
17
复选框
可以使用以下任一构造函数来创建复选框:
- Checkbox(),创建一个空的复选框,且未被选中
- Checkbox(String text),创建一个用给定字符串作为标签的复选框,且未被选中
- Checkbox(String text,Boolean on),创建一个标签由参数 text指定的复选框,允许通过参数 on设定复选框的初始状态。
用于多选项的用户输入,用户可以通过单击复选框来选定或取消选定某选项。
18
单选按钮
可以通过复选框组生成一系列互斥的复选框,实现单选按钮功能。
在一组单选按钮中只能选择一个按钮。
首先创建一个 CheckboxGroup 对象。
CheckboxGroup cg=new CheckboxGroup();
然后再创建各单选按钮。
Checkbox male=Checkbox("男 ",cg,true);
Checkbox female=Checkbox("女 ",cg,false);
19
复选框和单选按钮使用示例
import java.awt.*;
class Qualification extends Frame {
Checkbox t1=new Checkbox("Visual Basic");
Checkbox t2=new Checkbox("Visual C++");
Checkbox t3=new Checkbox("Java");
CheckboxGroup cg=new CheckboxGroup();
Checkbox r1=new Checkbox("专科 ",cg,false);
Checkbox r2=new Checkbox("本科 ",cg,false);
Checkbox r3=new Checkbox("硕士 ",cg,false);
Checkbox r4=new Checkbox("博士 ",cg,false);
Label lb1=new Label("您的学历为," );
Label lb2=new Label("您精通的语言为," );
新建复选框新建一个复选框组添加单选按钮
public Qualification(String s ) {
super(s);setLayout(new GridLayout(10,1));
add(lb1);add(r1);add(r2);add(r3); add(r4);
add(lb2);add(t1);add(t2);add(t3);
}
public static void main(String args[]) {
Qualification q=new Qualification ("学识 ! ");
q.setSize(400,250);
q.show( );
}
}
将单选按钮添加到窗体将复选框添加到窗体
20
选择框
用 Choice类可以创建一个选择框
Choice moviestars = new Choice( );
通过 addItem() 方法可以添加项目
moviestars.addItem("安东尼奥,班德拉斯 ");
moviestars.addItem("莱昂纳多,迪卡普尼奥 ");
moviestars.addItem("桑德,布洛克 ");
moviestars.addItem("休,葛兰特 ");
moviestars.addItem("朱莉亚,罗萡茨 ");
用来向用户显示一个选择列表
21
布局管理器
用户界面上的组件可以按不同方式排列。
Java使用布局管理器来管理这些排列方式 。
每当需要重新调整屏幕大小或重新绘制屏幕上任一项目时,就要用到布局管理器。
AWT提供一组用来进行布局管理的类,称为布局管理器或布局。所有布局都实现
LayoutManager接口。
22
布局类型
Java中的布局类型包括以下几种:
- FlowLayout( 流式布局)
- BorderLayout (边界布局)
- GridLayout(网格布局)
- GridBagLayout(网格包布局)
- CardLayout (卡片布局)
23
布局类型的选用
每个布局管理器都有自己特定的用途。
- 要按行和列显示几个同样大小的组件,
GridLayout 会比较合
- 要在尽可能大的空间里显示一个组件,就要选择 BorderLayout 或 GridBagLayout
24
如何设置布局
每个容器( Container对象)都有一个与它相关的缺省的布局管理器。
- Applet 的缺省布局是 FlowLayout
在没有设置新的布局前,在容器中添加组件都按照该容器的缺省布局排列。
可以通过 setLayout( )方法为容器设置新的布局。
25
FlowLayout
FlowLayout的构造函数有:
- FlowLayout( ):生成一个默认的流式布局
- FlowLayout(int alignment):可以设定每一行组件的对齐方式
- FlowLayout(int alignment,int horz,int vert):可以设定组件间的水平和垂直距离
Applet和面板的缺省布局
组件从左上角开始按从左到右、从上到下的方式排列
FlowLayout mylayout = new FlowLayout();
FlowLayout exLayout = new
FlowLayout(FlowLayout.RIGHT);
setLayout(exlayout); // 为容器设置新布局
26
BorderLayout 2-1
下面是 BorderLayout所定义的构造函数:
- BorderLayout( ):生成默认的边界布局
- BorderLayout(int horz,int vert),可以设定组件间的水平和垂直距离
窗口,框架和对话框等的缺省布局
组件可被置于容器的北、南、东、西或中间位置
27
BorderLayout 2-2
BorderLayout 类定义了几个常量值以指定相应区域:
- BorderLayout.NORTH – 对应容器的顶部
- BorderLayout.EAST – 对应容器的右部
- BorderLayout.SOUTH – 对应容器的底部
- BorderLayout.WEST – 对应容器的左部
- BorderLayout.CENTER – 对应容器的中部
加入组件方法:
void add(Component Obj,int region);
.,,
setLayout(new BorderLayout());
Button btnEast=new Button("东 ");
Button btnWest=new Button("西 ");
Button btnNorth=new Button("北 ");
Button btnSouth=new Button("南 ");
Button btnCenter=new Button("中 ");
add(btnEast,BorderLayout.EAST);
add(btnWest,BorderLayout.WEST);
add(btnNorth,BorderLayout.NORTH);
add(btnSouth,BorderLayout.SOUTH);
add(btnCenter,BorderLayout.CENTER);
.,,
28
GridLayout
GridLayout的构造函数如下所示:
- GridLayout():生成一个单列的网格布局
- GridLayout(int row,int col):生成一个设定行数和列数的网格布局
- GridLayout(int row,int col,int horz,int vert),可以设置组件之间的水平和垂直间隔
用于将容器区域划分为一个矩形网格
组件按行和列排列
.,,
Button btn[]; // 声明按钮数组
String str[]={"1","2","3","4","5","6","7","8","9"};
setLayout(new GridLayout(3,3));
btn=new Button[str.length]; // 创建按钮数组
for(int i=0;i<str.length;i++){
btn[i]=new Button(str[i]); add(btn[i]);
}
29
GridBagLayout
通过使用以下语法容器可获得 GridBagLayout:
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
要使用此布局,必须提供各组件的大小和布局等信息。
GridBagConstraints 类中包含 GridBagLayout
类用来定位及调整组件大小所需的全部信息。
组件大小不必相同
组件按行和列排列
放置顺序不一定为从左至右和由上至下
30
GridBagConstraints 类 2-1
成员变量列表:
- gridx,gridy,指定组件放置于哪个单元中
- gridwidth,gridheight,指定组件将占用多少行和多少列
- weightx,weighty,指定在一个 GridBagLayout
中应如何分配空间,这些变量的缺省值为 0
- ipadx,ipady,指定组件的最小高度和宽度
31
成员变量列表:
- fill,指定在单元大于组件的情况下,组件如何填充此单元,共有 4可选值。缺省值为:
GridBagConstraints.NONE
- anchor,指定将组件放置在单元中的位置,
共有 9个可选值。缺省值为:
GridBagConstraints.CENTER
GridBagConstraints 类 2-2
32
CardLayout
可存储几个不同的布局。
每个布局就像是一个卡片组中的一张卡片。
在一个给定的时间总会有一张卡片在顶层。
卡片通常为一个 Panel 对象。
每当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局。
33
总结 3-1
抽象窗口工具包( AWT) 是一组类,它允许创建图形用户界面,并能够通过键盘和鼠标响应用户的操作。
容器指可以存放组件的区域,两种常用容器类:框架( Frame类)和面板( Panel类)。
框架是一个单独的窗口,而面板只是包含在窗口中的一个区域。
AWT支持下列类型的组件:标签、文本域、
文本区、按钮、复选框、列表框等。
34
总结 3-2
布局管理器类提供控制 GUI 组件物理布局的一种方式。
以下是几种不同类型的布局:
- FlowLayout
- BorderLayout
- CardLayout
- GridLayout
- GridBagLayout
布局可通过 setLayout( ) 方法进行设置。
35
总结 3-3
FlowLayout 是 Applet 和 面板的缺省布局管理器。组件从左上角到右下角进行排列。
BorderLayout按北、南、东、西、中的不同区域划分将组件排列于容器中。
GridLayout 将组件按行和列排列。所有组件大小相同。
GridBagLayout 能将组件放置在最精确的位置。各组件的大小可以不同。
CardLayout可存储几个不同的布局管理器