AWT开发教程学习1。
第一节
AWT介绍
对一个好的应用程序来说,良好的图形用户接口(GUI,Graphic User Interface)是必不可少的。缺少良好的图形用户接口,将会给用户理解和使用应用程序带来很多不便。当Java在1995年第一次发布的时候,它包含了一个叫做AWT(Abstract Windowing Toolkit)的库,用来构建图形用户界面应用程序。
使用AWT开发GUI程序需要4个步骤。
我们可以打个家居设计的比喻。首先要选择一套房屋,这里相当于AWT的容器概念。然后要对房屋进行整体布局设计,比如一共需要几个房间,每个房间的大小和尺寸等,这里相当于AWT的布局管理器概念。整体布局规划好之后,我们开始布置每个房间,将各种家具或电器设备(相当于AWT的组件)安放在合适的位置。最后是确保家具或电器能够正常工作,例如,当使用电视机遥控调节音量时,电视机会正常做出反应,这里相当于AWT组件的事件处理。
在开发AWT过程中,要用到java.awt这个开发包(package)。它的基本结构如图10-1所示。
图10-1 java.awt开发包(package)的基本结构
理解了这些背景,对学习AWT应用程序就有了一个整体框架。下面我们具体学习每个步骤。首先是容器(Container)的概念。
2.1 容器
AWT容器分为两类:外部容器和内部容器。其中,外部容器一般会独立存在,例如Frame类;而内部容器则会嵌套在外部容器内部使用,例如Panel类。容器的层次结构如图10-2所示。
图10-2 AWT容器的层次结构
其中两个最常用的容器是Frame和Panel。在后面我们还要单独介绍Applet(一种特殊的Panel)。
— 框架(Frame):Frame是顶级窗口,可以显示标题,重置大小。
— 面板(Panel):面板提供了建立应用程序的空间。我们可以把图形元件(包括其他面板)放在一个面板上,然后把这个面板作为内部容器放在Frame等外部容器上。
容器类的常用方法包括:
add()
add(Component com)
add(Component, int index)
add(Component component, Object constraints)
add(String name, Component component),
add(Component component, Object constraints, int index)
setLayout() and getLayout()
getComponent()
getInsets()
remove and removeAll()
validate()
这些方法主要与我们后面讲的步骤,例如布局管理、添加组件有关。
2.2 布局管理
选择了容器之后,可以通过容器的setLayout()和getLayout()方法来确定布局(Layout),也就是限制容器中各个组件的位置和大小等。
Java提供了多种布局,如顺序布局(Flow Layout)、边界布局(Border Layout)和网格布局(Grid Layout)等。
1.顺序布局
顺序布局(Flow Layout)是最基本的一种布局,面板的默认布局就是顺序布局。顺序布局指的是把图形元件一个接一个地放在面板上。下面是一个顺序布局的例子。
package sample;
imp
imp
imp
public class MyFlowLayout {
private Frame f;
private Button button1, button2, button3;
public static void main (String args[]) {
MyFlowLayout mflow = new MyFlowLayout ();
mflow.go();
}
public void go() {
f = new Frame (“FlowLayout演示”);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
//f.setLayout(new FlowLayout());
f.setLayout(new FlowLayout(FlowLayout.LEADING, 20, 20));
button1 = new Button(“确定”);
button2 = new Button(“打开”);
button3 = new Button(“关闭”);
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize (200,200);
f.pack();
f.setVisible(true);
}
}
程序运行结果见图10-3。
图10-3 顺序布局(Flow Layout)
2.边界布局
边界布局(Border Layout)包括5个区:北区、南区、东区、西区和中区。这5个区在面板上的分布规律是“上北下南,左西右东”。下面是一个边界布局的例子。
package sample;
imp
imp
imp
public class MyBorderLayout {
Frame f;
Button east, south, west, north, center;
public static void main(String args[]) {
MyBorderLayout mb = new MyBorderLayout();
mb.go();
}
public void go() {
f = new Frame(“BorderLayout 演示”);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
f.setBounds(0, 0, 300, 300);
f.setLayout(new BorderLayout());
north = new Button(“北”);
south = new Button(“南”);
east = new Button(“东”);
west = new Button(“西”);
center = new Button(“中”);
f.add(BorderLayout.NORTH, north);
f.add(BorderLayout.SOUTH, south);
f.add(BorderLayout.EAST, east);
f.add(BorderLayout.WEST, west);
f.add(BorderLayout.CENTER, center);
f.setVisible(true);
}
}
程序运行结果见图10-4。
图10-4 边界布局(Border Layout)
3.网格布局
网格布局(Grid Layout)把面板分成一个个大小相等的网格,你可以给出网格的行数和列数。下面是一个网格布局的例子。
package sample;
imp
imp
public class MyGridLayout {
private Frame f;
private Button[] btn;
public static void main(String args[]) {
MyGridLayout grid = new MyGridLayout();
grid.go();
}
public void go() {
f = new Frame(“GridLayout演示”);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
f.setLayout (new GridLayout (3, 3, 10, 10));
btn = new Button[9];
for(int i = 0; i <=8; i++) {
int j = i + 1;
btn[i] = new Button(“” + j);
f.add(btn[i]);
}
// f.pack();
f.setSize(100, 100);
f.setVisible(true);
}
}
程序运行结果见图10-5。
图10-5 网格布局(Grid Layout)