JAVA教程第五讲AWT图形用户界面设计作者:许斌文章来源:清华大学计算机系&清华同方股份有限公司点击数:58868更新时间:2004-10-2原文地址:用AWT生成图形化用户界面抽象窗口工具包AWT(AbstractWindowToolkit)是API为Java程序提供的建立图形用户界面GUI(GraphicsUserInterface)工具集,AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括:用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。5.1.1java.awt包java.awt包中提供了GUI设计所使用的类和接口,可从图5.1中看到主要类之间的关系。java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念:组件--Component容器--Container布局管理器--LayoutManager5.1.2组件和容器Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:getComponentAt(intx,inty)getFont()getForeground()getName()getSize()paint(Graphicsg)repaint()update()setVisible(booleanb)setSize(Dimensiond)setName(Stringname)等容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。在程序中安排组件的位置和大小时,应该注意以下两点:1.容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。2.如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null);5.1.3常用容器容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都可以通过add()方法向容器中添加组件。有三种类型的容器:Window、Panel、ScrollPane,常用的有Panel,Frame,Applet。1.Frame以下是容器的例子:例5.1importjava.awt.*;publicclassMyFrameextendsFrame{publicstaticvoidmain(Stringargs[]){MyFramefr=newMyFrame(HelloOutThere!);//构造方法fr.setSize(200,200);//设置Frame的大小,缺省为(0,0)fr.setBackground(Color.red);//设置Frame的背景,缺省为红色fr.setVisible(true);//设置Frame为可见,缺省为不可见}publicMyFrame(Stringstr){super(str);//调用父类的构造方法}}一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize()来设置大小,调用setVisible(true)来设置该窗口为可见的。另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。2.Panel例5.2importjava.awt.*;publicclassFrameWithPanelextendsFrame{publicFrameWithPanel(Stringstr){super(str);}publicstaticvoidmain(Stringargs[]){FrameWithPanelfr=newFrameWithPanel(FramewithPanel);Panelpan=newPanel();fr.setSize(200,200);fr.setBackground(Color.red);//框架fr的背景颜色设置为红色fr.setLayout(null);//取消布局管理器pan.setSize(100,100);pan.setBackground(Color.yellow);//设置面板pan的背景颜色为黄色fr.add(pan);//用add方法把面板pan添加到框架fr中fr.setVisible(true);}}一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize()来设置大小,调用setVisible(true)来设置该窗口为可见的。另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。5.1.4LayoutManager布局管理器(1)java为了实现跨平台的特性并且获得动态的布局效果,java将容器内的所有组件安排给一个布局管理器负责管理,如:排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout例5.3importjava.awt.*;publicclassExGui{privateFramef;privateButtonb1;privateButtonb2;publicstaticvoidmain(Stringargs[]){ExGuithat=newExGui();that.go();}publicvoidgo(){f=newFrame(GUIexample);f.setLayout(newFlowLayout());//设置布局管理器为FlowLayoutb1=newButton(PressMe);//按钮上显示字符PressMeb2=newButton(Don'tPressMe);f.add(b1);f.add(b2);f.pack();//紧凑排列,其作用相当于setSize(),即让窗口尽量小,小到刚刚能够包容住b1、b2两个按钮f.setVisible(true);}}1.FlowLayoutFlowLayout是Panel,Applet的缺省布局管理器。其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。构造方法主要下面几种:FlowLayout(FlowLayout.RIGHT,20,40);/*第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素。*/FlowLayout(FlowLayout.LEFT);//居左对齐,横向间隔和纵向间隔都是缺省值5个象素FlowLayout();//缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素例5.4importjava.awt.*;publicclassmyButtons{publicstaticvoidmain(Stringargs[]){Framef=newFrame();f.setLayout(newFlowLayout());Buttonbutton1=newButton(Ok);Buttonbutton2=newButton(Open);Buttonbutton3=newButton(Close);f.add(button1);f.add(button2);f.add(button3);f.setSize(300,100);f.setVisible(true);}}当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,但是相对位置会发生变化。例如上图中有三个按钮都处于同一行,但是如果把该窗口变窄,窄到刚好能够放下一个按钮,则第二个按钮将折到第二行,第三个按钮将折到第三行。按钮Open本来在按钮OK的右边,但是现在跑到了下面,所以说组件的大小不变,但是相对位置会发生变化。2.BorderLayoutBorderLayout是Window,Frame和Dialog的缺省布局管理器。BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每个区域只能放置一个组件。各个区域的位置及大小如下图所示:例5.5importjava.awt.*;publicclassbuttonDir{publicstaticvoidmain(Stringargs[]){Framef=newFrame(BorderLayout);f.setLayout(newBorderLayout());f.add(North,newButton(North));//第一个参数表示把按钮添加到容器的North区域f.add(South,newButton(South));//第一个参数表示把按钮添加到容器的South区域f.add(East,newButton(East));//第一个参数表示把按钮添加到容器的East区域f.add(West,newButton(West));//第一个参数表示把按钮添加到容器的West区域f.add(Center,newButton(Center));//第一个参数表示把按钮添加到容器的Center区域f.setSize(200,200);f.setVisible(true);}}在使用BorderLayout的时候,如果容器的大小发生变