Java使用AWT和Swing类完成图形用户界面编程,AWT全称是Abstract Window Toolkit,即抽象窗口工具集,它是Sun最早提供的GUI库,只是这个库功能比较有限,后来又提供了Swing库。通过使用AWT和Swing提供的图形界面组件库,就可以基于图形界面的程序。只有界面是不够的,为了实现图形用户界面与用户交互操作,Java提供了事件处理,用于响应用户的操作。
GUI Graphics User Interface 简称GUI,图形用户界面,Java提供了基本的构建GUI的类库,这个类库就是AWT。AWT是一个窗口框架,它从不同平台的窗口系统中抽取共同组件,当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台。简而言之,当使用AWT编写图形界面应用时,程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM调用操作系统本地的图形界面来创建和平台一致的对等体。使用AWT创建的图形界面应用和所在运行平台有相同的界面风格,比如在Windows操作系统上,它就表现出Windows风格,在UNIX系统上就表现Unix风格。但是AWT有自身的缺点:
1.使用AWT作出的图形用户界面在所有平台上都很丑陋,功能也非常有限
2.AWT为了迎合所有主流操作系统的界面设计,AWT组件只能使用这些操作系统上图形界面组件的交集,所以不能使用特定操作系统上负责的图形界面组件,最多只能使用四种字体
3.AWT用的是非常笨拙的、非面向对象的编程模式
。SWING是由网景公司和SUN合作提供的,这套GUI库的所有图形界面组件,例如文本框、按钮等都是绘制在空白窗口上的,只有窗口本身需要借助操作系统的窗口实现。但是保留了AWT事件模式。
注意:
Swing并没有完全替代AWT,而是建立在AWT基础之上,Swing仅提供了能力更强大的用户界面组件,即使是完全采用Swing编写的GUI程序中,依然需要使用AWT的事件处理机制。
所有和AWT编程相关的类都在java.awt包及子包中。AWT编程有两个基类,Component和MenuComponent。其中Component代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button代表按钮,TextField代表文本框,而MenuComponent代表了图形界面的菜单组件,包括MenuBar、MenuItem等子类
AWT组件继承图
2.AWT
2.1 AWT容器
任何一个窗口都可以看出一个空的容器与很多组件的结合体。通过设置组件的大小、位置等属性,就可以将该空容器和基本组件组成一个整体的窗口。容器Container是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component的所有方法。Component类有如下几个常用方法来设置组件的大小、位置和可见性。
setLocation(int x,int y):设置组件位置 setSize(int width,int height):设置组件的大小 setBounds(int x,int y,int width,int height):同时设置组件的位置和大小 setVisible(Boolean b):设置组件的可见性
除此之外,容器还有盛装其他组件的功能,容器类(Container)有如下方法来访问容器里的组件:
Component add(Component comp):向容器中添加其他组件,该组件可以是普通组件,也可以是容器,并返回被添加的组件 Component getComponentAt(int x,int y):返回指定点的组件 int getComponentCount():返回该容器内组件的数量 Component[] getComponents():返回该容器内的所有组件
AWT主要提供了两种主要的容器类型
Window:可独立存在的顶级窗口,如Frame
Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中,如Window、Panle或者Applet等
AWT继承图
上述显示了AWT容器之间的继承层次,其中粗黑线圈的容器是AWT编程中常用的组件。
在java.awt包中提供了两种基类来表示图形界面元素:Component和MenuComponent,其中Component代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button代表一个按钮,TextField代表一个文本框,而MenuComponent则代表了图形界面的菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等子类。
除此之外,AWT图形用户界面编程里还有两个重要的概念:Container和LayoutManager,其中Container是一种特殊的Component,它代表一种容器,可以盛装普通的Component,而LayoutManager则是容器管理器中其他组件的方式。
Window类两个子类,java.awt.Dialog和java.awt.Frame。用到的基本都是这两个来放控件。当你用要出现图形界面,要关闭窗口时,就必须得用到Window 提供的Windou事件类中的WindowClosing方法。WindowOpened、 WindowClosed,还有其他一些方法,都是来控制窗口打开,关闭,最小化等功能的
2.2 Frame
其中Frame代表常见的窗口,它是Window类的子类,具有如下特征:
1.Frame对象有标题,允许通过拖拉来改变窗口的位置、大小
2.初始化时为不可见,可用setVisible(true)使其显示出来。
代码:
package chapter1; import java.awt.*; public class TestFrame { public static void main(String[] args){ Frame f = new Frame(); f.setBounds(30, 20, 22, 27); f.setVisible(true); f.setTitle("我是大头"); } }
这个窗口是windows风格的(最大化、最小化以及X还有颜色同windows风格是一样的),这也证明了AWT确实是调用程序运行平台本地API创建了该窗口,如果点击X,窗口不会被关闭,因为我们并未为该窗口编写任何事件响应,如果想关闭该窗口,可以通过关闭运行该程序的命令行窗口来关闭该窗口。如果是eclipse直接终止表示程序运行中的红方块即可
2.3 Panel
Panel是AWT中另一个典型的容器,它代表不能独立存在,必须放在其他容器中的容器,Panel外在表现为一个矩形区域,该区域可以装在其他组件中,Panel容器存在的意义在于为其他组件提供空间,Panel容器有如下几个特点:
1.可作为容器来盛装其他组件,为放置组件提供空间
2.不能单独存在,必须放在其他容器中
3.默认使用FlowLayout作为其布局管理器
package chapter1; import java.awt.*; public class TestPanel { public static void main(String[] args){ //创建一个容器 Frame frame = new Frame(); frame.setBounds(500,500,700,700); frame.setVisible(true); frame.setTitle("我是容器"); //创建容器里面的一个面板 Panel panel = new Panel(); //往面板里面添加组件 panel.add(new TextField("姓名")); panel.add(new Button("单击我")); frame.add(panel); } }
2.3 ScrollPane
ScrollPane是一个带滚动条的容器,它也不能独立存在,必须被添加到其他容器中。ScrollPane容器具有如下特点:
1.可作为容器来盛装其他组件,当组件占用空间过大时,ScrollPane自动产生滚动条,当然也可以通过指定特定的构造器参数来指定默认具有滚动条。
2.不能单独存在,必须放置到其他容器中。
3.默认使用BorderLayout作为其布局管理器,ScrollPane通常用于盛装其他容器,所以通常不允许改变ScrollPane的布局管理器。
package chapter11; import java.awt.*; public class TestScrollPane { public static void main(String[] args){ //创建一个窗口 Frame f = new Frame("奇奇大排档"); //创建一个ScrollPane容器,并且指定总是有滚动条 ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); sp.add(new TextField(20)); sp.add(new Button("单击我")); //将ScrollPane对象添加到Frame容器中 f.add(sp); //设置窗口的大小、位置 f.setBounds(20, 20, 177, 277); //将窗口显示出来 f.setVisible(true); } }