第6章 Java图形用户界面设计
6.1 图形用户界面(GUI)概述
用户界面是用户和计算机系统交互的接口。用户界面功能是否完善和便捷直接影响到用户对软件的使用。 图形用户界面(Graphics User Interface)简称GUI,使用图形的方式借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便的发出系统命令,启动操作。Java的基础类(Java Foundation Classes,JFC)是开发GUI的API集,它包括以下几个部分:
AWT(抽象窗口工具包):Java开发图形用户界面最初的工具包,是建立JFC的主要基础; Swing组件:建立在AWT之上,新的、功能更强大的图形组件包;
Java语言为了方便图形用户界面的开发,设计了专门的类库来生成各种标准图形界面和处理图形界面的各种事件, 这个类库就是java.awt包。
AWT是Abstract Window Toolkit(抽象窗口工具集)的缩写。
AWT类库中的各种操作被定义在一个并不存在的抽象窗口中进行,以实现跨平台性。
AWT抽取了不同软硬件平台中所实现的窗口的公共特性。所设计的界面独立于具体的界面实现 。 AWT提供与机器无关的基本GUI标准组件。 AWT包含的构件太多,主要讨论以下几个最重要的类:
基本的窗口类:Frame,Dialog。
基本的GUI构件类:Button,Label,TextField,TextArea。
基本的事件接口:ActionListener,WindowListener,MouseListener,KeyListener。 基本的版面控制:FlowLayout,BorderLayout,GridLayout,Panel。 基本的绘图支持:Graphics,Canvas。 java.awt包中的类及相互关系可以用下图来描述: java.lang.Object字体类GraphicsButtonComponentList颜色类布局管理类图像类菜单类事件类
CheckboxContainerpanelWindowFrameDialogApplet6.2 基本的图形用户界面类 Component类
java.awt包中最核心的类就是Component类,大部分控制组件都是由该类派生出来的,用于完成与用户的交互。 Component定义了组件所具有的一般功能:
基本的绘画支持(方法paint, repaint, update等)、 字体和颜色等外形控制(方法setFont, SetForeground等)、 大小和位置控制(方法setSize, setLocation等)、 图象处理(接口ImageObserver)
组件状态控制(方法SetEnable, isEnable, isVisible, isValid等)
常用的组件包括:Button, Checkbox, CheckboxGroup, Choice, Label, List, Canvas, TextComponent, Scrollbar等。 Container类
Container类是由Component类派生出来的一种特殊类,用来表示各种GUI组件的容器。通常,一个图形用户界面程序首先对应于一个容器,这个容器再进一步包括其它的界面成分和元素,以构成
一个复杂的图形界面系统。 Container类主要功能包括:
组件的管理:如方法add()可以向其中添加一个组件,remove()删除其中的一个组件,… 布局管理:每个Container类都和一个布局管理器相联,以确定其中组件的布局。 Container类可以通过setLayout()方法设置某种布局方式。
常见的Container类有:Window, Frame, Panel, Applet等。 AWT对Container类的定义为:
public abstract class Container extends Component{
protected Container()
public void add(Component comp)
public void add(Component comp, Object constraints) public Insets getInsets()
public void setLayout(LayoutManager mgr) public void validate()
public Dimension getPreferredSize() public void paint(Graphics g) }
Window类
Window类表示一个没有边界和菜单的最高层的窗口,可以包含AWT的其他构件。初始化时,窗口是不可见的。AWT将窗口定义为: public class Window extends Container{
public Window(Frame parent) public void pack() public void setVisible() public void toFront() public void toBack()
public void addWindowListener(WindowListener l) public void removeWindowListener(WindowListener l) }
Frame 类
一个Frame是包括标题、菜单、文本区和按钮的图形窗口,其外观依赖于所使用的的操作系统。Frame包含在一个方框内,其大小可以伸缩。AWT对Frame类的定义的大致框架为: public class Frame extends Window implements MenuContainer{
public Frame()
public Frame(String title) public String getTitle()
public void setTitle(String title) public MenuBar getMenuBar()
public void setMenuBar(MenuBar mb) //设置菜单条 public void dispose() }
//重载的构造方法
【例6.1】 下面用一个简单程序来建立一个Frame对象,并使之可见。 import java.awt.Frame; public class MyFrameTest{
public static void main(String args[ ]){
Frame myFrame = new Frame(\
myFrame.setVisible(); //使一个Frame可见 } }
当这个程序执行时,会出现一个带标题的小窗口,这个窗口可以伸缩并且包含有标准的关闭按钮。但目前这个窗口还没有响应关闭按钮的能力,因此必须按CTRL+C键来关闭窗口. 6.3 简单的事件响应程序
什么是事件(Event)?
事件 (Event): 发生在用户界面上的用户交互行为而产生的一种效果,如鼠标的各种点击动作、键盘的操作以及发生在组件上的各种动作。事件一般也分为三种类型:键盘事件、鼠标事件以及组件的动作事件(对鼠标或键盘事件在一定程度上进行了封装)。 事件源(Event Source):产生事件的对象。
事件处理(Event handler):接收事件对象消息并对其进行处理的方法。 6.3.1 一个简单的构件与事件的响应
大多数的程序通过GUI构件与用户进行交互。最简单的GUI构件是按钮。当用户单击一个按钮时,它就产生一个事件,该事件被一个类的特殊方法所接受,并采取相应的处理方法。Button类的定义为: public class Button extends Component {
public Button()
public Button(String label) public String getLabel()
public void setLabel(String label)
public void addActionListener(ActionListener l) public void removeActionListener(ActionListener l) }
【例6.2】 构造一个类,该类为一个带有标题的Frame,Frame中包含一个Quit按钮,单击该按钮就退出程序。所以,要构造的类扩展Frame类,并包含一个Button域。像大多数类一样,它有一个构造方法和一个可执行的main()方法,其程序框架如图所示 :
以上程序执行时,当单击按钮时,没有什么反应。这是由于仅在按钮上标有“Quit”,并没有给它添加足够的机制使它产生相应的行为,要使它作出正确的响应需要如下3个步骤:
通知JVM该类要监督和处理一个动作事件。 激活按钮,使得单击按钮时产生一个事件。 实现一个方法来说明如何处理这个按钮事件。
Java提供了ActionListener接口将GUI构件产生的事件(如按钮产生的事件)与一个特定的事件响应方法联系起来,使之能够决定怎样响应某些事件。 ActionListener接口
ActionListener是java.awt.event包中的一个接口,它定义了一个特定的事件处理方法。AWT 对这个接口的定义是:
public interface ActionListener extends EventListener { // 说明抽象方法
public abstract void actionPerformed(ActionEvent e) }
【例6.3】 本例介绍怎样利用ActionListener 接口来监听一个按钮,然后说明这个按钮应该引起哪些事件。
分析这个例子,一个基本的按钮事件驱动程序可以按照下面的框架来编写: 从java.awt和java.awt.event中装载所有的类 定义一个类扩展Frame并且实现ActionListener接口 定义GUI构件,如button等,作为该类的域
使用构造方法来定义构件的布局,并用buttonName.addActionListenerName(this)来激活按钮 定义一个方法public void actionPerformed(ActionEvent ae)来说明单击按钮后要采取的行动。 6.3.2 简单的GUI输入输出
TextField类
TextField是对一行文本进行编辑的一个构件。它用来接受用户的输入或显示可编辑的文本输出。AWT对它的定义为:
public class TextField extends TextComponent {
public TextField()
public TextField(String text) public TextField(int columns)
public TextField(String text,int columns) public void addActionListener(ActionListener l) public void removeActionListener(ActionListener l) }
TextComponent类
TextComponent是一个允许创建、检索和修改文本的类。AWT 对这个类的定义为: public class TextComponent extends Component{
public void setText(String t) public String getText() public boolean isEditable() public void setEditable(boolean b) public String getSelectedText()
public void addTextListener(TextListener l) public void removeTextListener(TextListener l) }
【例6.4】 编写一个程序包含有两个按钮和一个文本输出区,其中一个按钮引起程序退出,另一个按钮在输出区显示文本,而且每次当第二个按钮被单击时交替地显示两种文本。 我们可以用IS、HAS和DOES来定义这个类的轮廓:
IS:Frame和ActionListener。
HAS:两个按钮和一个文本输出区,并需要一个boolean变量来决定显示哪个字符串。
DOES:用main()方法使这个程序可执行,用构造方法进行初始化,并用actionPerformed()处理按钮事件。
如何在构造方法中放置两个按钮和一个文本域。我们先用setLayout(new FlowLayout())将所有的构件排列在一行。
(2)actionPerformed()方法需要对单击quit和click按钮做出响应,所以需要找出内部接受到的事件源。使用ActionEvent类的getSource()方法,该方法返回一个事件源。 例6.4 6.4 事 件 处 理 6.4.1 基本事件
在所有基于GUI的程序中,其核心是事件。
事件是可视化构件或用户接口构件产生的信息,Java类通过使用特殊的方法能够对它作出反应。 所有的事件保存在系统级的事件队列中,可由事件响应方法对它们进行检索并作出响应。 事件分为如下两种类型: 低级事件:
表示低级输入或在屏幕上的可视构件窗口系统事件,这些事件描述为:
ComponentEvent(组件事件:组件尺寸的变化,移动) ContainerEvent(容器事件:组件增加,移动)
WindowEvent(窗口事件:关闭窗口,窗口闭合,图标化) FocusEvent(焦点事件:焦点的获得和丢失)