l 图形用户界面( GUI , Graphical User Interface )使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发送指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。图形用户界面操作简单,省去了字符界面用户必须记忆各种命令的麻烦,深受广大用户的喜爱和欢迎。所以学习设计和开发图形用户界面,是应用软件开发人员必修的一课。
图形用户界面的概念
l 图形用户界面是一种方便的人机界面。它通过图形的方法,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机发出命令,启动程序,并将程序的运行结果同样以图形的形式显示给用户。
GUI 支持包
l Java 语言在 java.awt 包中提供了大量地进行 GUI 设计所使用的类和接口,包括绘制图形、设置字体和颜色、控制组件、处理事件等内容, AWT 是 Java 语言进行 GUI 程序设计的基础。
l javax.swing包 是 Java 语言提供的第二代 GUI 设计工具包,它以 AWT 为基础,在 AWT 内容的基础上新增或改进了一些 GUI 组件,使得 GUI 程序功能更强大,设计更容易、更方便。
AWT
l Abstract Window Toolkit
l Java 处理图形用户界面的初始途径。
l AWT 库处理图形的方法:把这些元素的创建和行为交给目标平台上的本地 GUI 工具集进行处理。
l 理论上 “一次编写,随处运行” 。
l 依赖于平台上的组件的能力,不同平台的用户体验有微妙的差异。
l 实际上 “一次编写,随处调试” 。
AWT 包中类的继承关系
Swing
l Swing 处理图形的方法:采用 自行绘制 的方式来完成对图形组件的显示。
l 不依赖于平台,外观完全一致。
l 真正实现了 “一次编写,随处运行” 。
l 在外观的控制上完全取代了 AWT 。
l Swing 没有完全取代 AWT : Swing 包中的类都是从 AWT 包中较上层的类继承过来的,仍然沿用 AWT 提供的事件处理机制。
GUI 元素
l 组件:由 AWT 和 Swing 类所创建的对象。
l 容器:能容纳其它组件的组件。
l 这好比:池子里有盆,盆里有碗,碗里有勺。不同的组件,按一定的容纳关系构成了整个界面。
l 顶层容器
– 是 Swing 界面的最顶层元素,好比:池子。
l 顶层容器就是界面中的主窗口,或母窗口。它没有父容器。
最基本的 Swing 应用程序
import javax.swing.*;
public class T1 extends JFrame
{
public static void main(String[] args)
{
JFrame a = new JFrame(); //创建窗体对象
a.setTitle("OK"); //设置对象属性
a.setSize(400,300);
a.setVisible(true);
}
}
//通过生成JFrame对象,然后在修改它的属性的方式不是很方便。
//常见的做法是继承JFrame类,然后在自己类的构造方法中完成所有
//界面的初始化工作。
JFrame 的复杂结构
JFrame 的初级用法
l getContentPane () 获得内容面板,然后在其上添加组件。
l 不要组件直接加到 JFrame 对象上。
– ContentPane 好比热水瓶的内胆
在面板上加入组件
l 最有用的组件:
– JLabel 可以设字体,颜色
– JTextField 可以接受用户输入
– JButton 可以响应用户的点击
– JComboBox 可以下拉列表供选择
– JCheckBox 提供多选按钮
– JRadioButton 提供单选按钮
l 每种组件的具体用法参见例程
JPanel
l 经常作为中间容器,为可见的组件分组,控制它们的布局关系和显示效果。
l JPanel 一般不可见,只是专门作为构造组间关系的过渡容器。
l
常用布局方式
l BorderLayout
– 边界布局方式。东西南北中。
l FlowLayout
– 象流水一样,塞满第一行,塞第二行
l GridLayout
– 网格布局。分割为等大小的格子
设置布局方式
l 容器 . setLayout (new FlowLayout ())
– 设为流布局
l 默认的布局
– 每个容器都有自己的默认布局方式
– JFrame 默认的是 BorderLayout
– JPanel 默认的是 FlowLayout
事件模型
l 一次事件的处理,涉及三个对象:事件源对象,事件对象,事件处理者对象。
l 事件模型的好处
– 事件的“当事人”自己不去处理事件,避免了大量继承的繁冗
处理过程
l 每种类型的事件都有一个对应的接口。
l 事件处理者 ( 监听器 ) 通常是一个类,该类如果能够处理某种类型的事件,就必须实现与该事件类型相对应的接口。
l 事件源对象把某种类型的事件委托给实现了该种事件处理接口的类的对象。以后,当这个事件源对象上发生了该种特定类型的事件时,就会自动去调用事件处理者 ( 监听器 ) 对象中相应的方法。
委托的花样
l 一个事件源可以委托多个事件处理者
– 当事件发生的时候,执行多个动作
l 多个事件源以委托同一事件处理者
– 当进入处理方法时,需要判定是哪个事件源的事件
命名的约定
l 事件名: XxxEvent
l 接口名: XxxListener
l 监听器向产生事件的事件源注册,那么事件源与事件处理者就建立了联系。需要委托方法 addXxxListener ( )
l 注册格式:事件源对象 . addXxxListener ( 监听器对象 )
l
ActionEvent
l 按钮的点击动作
l 文本编辑框上的回车动作
l 菜单的点击动作
l
l ActionListener 接口名
l addActionListener ( )
ActionEvent 的方法
l getSource ()
– 取得事件发生的“事件源”对象
l getActionCommand ()
– 取得按钮的标题
– 取得菜单项的标题
鼠标事件
l MouseEvent
– 鼠标的普通动作
l MouseMotionEvent
– 与鼠标的移动有关的事件