图形用户界面 设计
辽宁经济职业技术学院信息系
硕士、副教授 陈英
Java基础类Java2D, Accessibility, Drag& Drop,和 Accessibility API是AWT和 JFC的一部分, 但它们
不属于 Swing。 这是因为, 这些
组件使用了一些本地代码, 而
Swing却不是这样的 。
swing组件的层次结构
GUI类是可视的,它
从 JComponent继承
而来,因此称为, J”
类。
Java基础类
JDK1.2提供了 Java基础类,其中的一部
分就是 Swing。 Swing是构筑在 AWT上层
的一些组件的集合 (为了保证平台独立性,
它是用 100%的纯 Java编写 )。
AWT本身是非常有用的,它是一个新的
类集合的一部分。这个新的类集合称为
Java基础类( JFC),它作为一个整体,
将 GUI提升到了一个新的水平层次。
Java基础类是关于 GUI组件和服务的完
整集合,它大大简化了健壮 Java应用程
序的开发和实现。
Java基础类
JFC(Java Foundation Class),作为 JDK1.2的一个
有机部分,主要包含 5个 API,AWT,Java2D,
Accessibility,Drag & Drop,Swing。它提供了帮
助开发人员设计复杂应用程序的一整套应用程序
开发包 。
Java2D是一图形 API,它为 Java应用程序提供了
一套高级的有关二维 ( 2D) 图形图像处理的类 。
Java2D API扩展了 java.awt和 java.awt,image类,
并提供了丰富的绘图风格, 定义复杂图形的机制
和精心调节绘制过程的方法和类 。 这些 API使得
独立于平台的图形应用程序的开发更加简便 。
Java基础类
Accessibility API提供了一套高级工具,
用以辅助开发使用非传统输入和输出的应
用程序。它提供了一个辅助的技术接口,
如:屏幕阅读器,屏幕放大器,听觉文本
阅读器(语音处理)等等。
Drag & Drop技术提供了 Java和本地应用
程序之间的互操作性,用来在 Java应用程
序和不支持 Java技术的应用程序之间交换
数据。
Java基础类
JFC模块的重点在 Swing。 Swing用来进行
基于窗口的应用程序开发,它提供了一套
丰富的组件和工作框架,以指定 GUI如何独
立于平台地展现其视觉效果。
Swing提供了一整套 GUI组件,为了保证可
移植性,它是完全用 Java语言编写的。
Swing的体系结构:
1) 它是围绕着实现 AWT各个部分的 API构筑的
2) 大多数组件不象 AWT那样使用与平台相关的实

图形用户界面
图形用户界面 (graphics user interface),简称
GUI。
生成 GUI所需的基本元素在两个包中:
1) java.awt
2) javax.swing
抽象窗口化工具箱 ——Abstract Windows
Toolkit
Awt中存储着原来在 java 1.1中生成的 GUI的类,
但它定义的许多类已经在 java 2中被 javax.swing
中的类替代。
javax.swing包中的大多数类定义了 GUI元素,它
们被称为 swing组件。
AWT
基本 AWT库处理用户界面元素的方法是把这些
元素的创建和行为委托给每个目标平台
(Windows,Solaris)上的本地 GUI工具箱进行处
理。
java.awt组件在很大程度上依靠于本机代码,因
此受到界面功能的“最小公分母”集的限制。
由于不同平台上的 AWT用户界面库存在着不同
的 bug,所以程序员需要在每一个平台上测试他
们的应用程序,所以 AWT是“一次编写,随处
调试”。
Swing
Swing类被放在 javax.swing包中。包名
javax表示这是一个 Java扩展包,而非一
个核心包。
Swing类实际上是对 Java1.1的扩展。因为
Swing类并不是核心层次的一部分。
在 Java 2平台上,Swing包不在属于扩展,
而是已经成为核心层次的一部分了。
尽管如此,Java 2仍然采用 javax名字。
Swing
Swing提供了比 Awt中定义的类更好的替代组件,
具有更丰富并且更方便的用户界面元素组合。
Swing组件完全是 java代码,它对底层的依赖更少,
因此它们不会受到运行所在的系统平台特性的限
制。
Swing会带来交叉平台上的统一视觉体验。
Swing组件一般都是由 java.awt中的基础类派生而
成的,它对后者有依赖关系,所以不能忽视
java.awt。
Swing是围绕着一个称为 JComponent的新组件构
建的, 而 JComponent则由 AWT的容器类扩展而
来 。
创建一个框架
在 java中,顶层窗口(没有包含在另一个窗
口内的窗口)称作框架。
AWT库有一个基于对等体的类 Frame对应着
的顶层。该类的 Swing版本称作 J Frame;
J Frame扩展了 Frame类,它是少数几个不在
画布上绘制的 Swing组件之一。
框架是容器的例子。这意味着一个框架可能
容纳诸如按钮和文本域之类的其他应用用户
界面组件。
JFrame和 JPanel类的继承层次
Object
Component
Container
JComponent Windows
JPanel Frame
JFrame
标题
一个 JFrame的内部结构
JFrame
JRoot
JLayeredPane
Menu Bar菜单条
Content Pane内容窗格
Grass Pane透明窗格
当添加一个框
架时,组件会
被添加到内容
窗格中
框架定位
JFrame类自己只有几个用来改变框架外观的
类。通过继承 Frame中的方法可以处理框架的
大小和位置。
1) dispose方法:关闭窗口并收回用于创建窗口的任
何系统资源。
2) setIconImage方法:当窗口最小化时,把一个
Image对象用作图标。
3) setTitle方法:改变标题栏中的文字。
4) setResizable方法:使用一个 boolean参数来决
定框架大小是否有用户改变。
frame.setDefaultCloseOperation(JFrame.EXIT
_ON_CLOSE);
当用户关闭框架时的响应动作。
窗口操作
在 java中可以通过调用 awt包中的 Toolkit类来得
到与系统相关的一些信息。
Toolkit类有一个 getScreenSize方法可以把屏幕
尺寸作为一个 Dimension对象返回。
1) Toolkit kit = Toolkit.getDefaultToolkit();
2) Dimension screenSize = kit.getScreenSize();
3) int screenHeight = screenSize.height;
4) int screenWidth = screenSize.width;
5) Image img = kit.getImage("icon.gif");
6) setIconImage(img);
java.awt.Component
void setSize(int width,int height)
void setSize(Dimension d)
point setLocation() 返回组件左上角的坐标值
Dimension getSize() 得到组件的当前大小
boolean isVisible() 检查组件是否可见
boolean isShowing() 检查该组件是否正显示在屏
幕上
boolean isEnabled() 检查组件是否被启用了
void repaint(),尽可能快地”重新绘制组

Public void repaint(int x,int y,int width,int height)
“尽可能快地”重新绘制组件的一部分
把组件缩放到
指定高度和宽度
javax.swing.JComponent
void paintComponent (Graphics g)
需要重载该方法来说明你的组件应如何绘制
javax.swing.JFrame
?Container getContentPane()
?返回给 Jframe的内容窗格对象
java.awt.Frame
? void setResizable(boolean b)
? 决定用户是否可以缩放框架
? void setTitle(String s)
? 把框架的标题栏中的文本设为字符串
? void setIconImage(Image image)
? 参数,inage需要用作框架图标的图像
java.awt.Window
void toFront() 把窗口显示到任何其他窗口之前
void toBack()
把窗口移动到桌面上窗口栈的后面并且相应地重新
排列所有可见的窗口。
java.awt.Toolkit
? Dimension getScreenSize() 得到用户屏幕的大小
? Image getImage(String filename)
? 从名为 filename的文件加载一幅图像。
2D图形
随着 SDK2.0版的到来,J2SE包含了一个 Java2D
库。该库实现了一个非常强大的图形操作集。
若要在 Java2D库中绘制图型,需要得到一个
Graphics2D类的对象。该类是 Graphics类推一个
子类。
使用诸如 paintComponent这样的方法,系统会自
动接受一个 Graphics2D类的对象。例如:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
… …
}
形体类之间的关系
Point2D
Point
Shape
Rectangular
Shape
Line2D
Rectangle2DEllipse2D
Rectangle