Java GUI概述
基于Swing的GUI构造方法
AWT事件处理模型
Swing组件
一、Java GUI概述
1、抽象窗口工具集AWT简介
设计目标是具有独立于平台的API,但同时保留每个平台的界面显示风格L&F(look and feel)
实现方法是:定义各种组件(Components)类平台独立的API,然后利用特定于平台的各种类的实现(称为对等组件,peers)提供具有特定平台风格的L&F
2、AWT组件
Java.awt包包括建立GUI所需基本组件。
Java.awt的主要类及层次关系
二、基于Swing的GUI构造方法
1、Swing简介
Swing中的所有组件全部用Java语言实现。
采用分离模型:组件及与组件相关的数据模型(或简称模型)
可设置的组件外观感觉(look and feel )
与AWT相比提供更丰富的GUI组件,引入新的特征,并提供更丰富的功能。
2、基于Swing的GUI设计步骤
3、Swing中的Look&Feel
4、常用容器
容器本身也是一个组件,具有组件的所有性质,另外还具有容纳其它功能
所有的组件都可以通过add()方法向容器中添加组件
在Swing中,常用的三种类型的容器是JFrame,JPanel,JApplet
具有Swing GUI的应用必须有至少一个顶层容器
顶层Swing容器是JFrame、JDialog或JApplet的实例
Swing GUI形成顶层容器-中间层容器-基本组件的层次包容关系
(1)向顶层容器中加入组件
Swing组件不能直接添加到顶层容器中,必须添加到一个与顶层容器相关联的内容面板(Content Pane)上
对JFrame添加组件
用getContentPane()方法获得JFrame的内容面板,再使用add()方法向其中加入组件。
frame.getCOntentPane().add(new Jlabel(“Hello!”));
建立一个JPanel等中间容器,把组件添加到中间容器中,再用setContentPane()方法把该容器设置为JFrame的内容面板
JPanel contentPane = new JPanel();
JButton b = new JButton(“确定”);
contentPane.add(b);
… …
rame.setContentPane(contentPane);
在JDK1.5后的版本中,add()方法被重写,可以把通过该方法添加的组件自动转交给内容面板
frame.add(child); //child组件将被添加到frame的内容面板中。
(2)JFrame
JFrame是最常用的顶层容器,一般作为Java Application的主窗口
(3)JPanel
JPanel是存放轻型组件的通用容器,缺省情况下是透明的,其对象可作为顶层容器的Content Pane使用。
5、Layout Manager(布局管理器)
容器中组件的布局通常由Layout Manager控制。
Layout Manager负责决定容器的布局策略及容器内每个组件的大小
每个容器都由一个缺省的Layout Manager ,可通过setLayout( )方法改变
Java提供的布局管理器
FlowLayout
BorderLayout
GridLayout
CardLayout
GridBagLayout
BoxLayout
6、Flow Layout Manager
组件采用从左到右,从上到下逐行摆放
例:
import java.awt.*;
import javax.swing.*;
public class FlowLayoutWindow extends JFrame {
public FlowLayoutWindow() {
setLayout(new FlowLayout());
add(new JLabel("Buttons:"));
add(new JButton("Button 1"));
add(new JButton("2"));
add(new JButton("Button 3"));
add(new JButton("Long-Named Button 4"));
add(new JButton("Button 5"));
}
public static void main(String args[]) {
FlowLayoutWindow window = new FlowLayoutWindow();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setTitle("FlowLayoutWindow Application");
window.pack();//窗口的大小设置为适合组件最佳尺寸与布局所需的空间
window.setVisible(true);
}
}
7、Border Layout Manager
Border Layout 分5个区:
构造与安装Border Layout:
setLayout(new BorderLayout( )) -组件间无缝隙
setLayout(new BorderLayout( int hgap, int Vgap));
加入组件:
add(button, BorderLayout.CENTER)
(3)Grid Layout Manager
把窗口分成网格,n行*m列。组件从左到右,从上到下填充。
构造与安装布局管理器:
setLayout(new GridLayout(int rows, int cols));
import java.awt.*;
import javax.swing.*;
public class GridLayoutWindow extends JFrame {
public GridLayoutWindow() {
setLayout(new GridLayout(0,2));
add(new JButton("Button 1"));
add(new JButton("2"));
add(new JButton("Button 3"));
add(new JButton("Long-Named Button 4"));
add(new JButton("Button 5"));
add(new JButton("6"));
}
public static void main(String args[]) {
GridLayoutWindow window = new GridLayoutWindow();
window.setTitle("GridWindow Application");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
}
}
(4)Card Layout Manager
把组件象一系列卡片一样叠放,一个时刻只能看到最上面的。
(5)GridBag Layout
GridBagLayout不需要组件的尺寸一致,容许组件扩展到多行、多列。
(6)BoxLayout
BoxLayout(箱式布局管理器)将组件垂直摆放在一列或水平摆放在一行中
8、如何选择布局管理器
组件尽量充满容器空间——使用BorderLayout或GridBagLayout
组件以自然大小紧凑的在一行中显示——FlowLayout
组件大小相同,并且成行或成列显示——GridLayout
9、GUI的设计步骤
引入Swing 包及其它程序包
选择GUI的外观风格L&F
创建并设置顶层容器
创建与添加Swing组件
显示顶层容器,将整个GUI显示出来
增加事件处理
三、AWT事件处理模型
基于Swing的GUI中,仍然采用AWT的事件处理模型
什么是事件
事件处理机制
事件目录
事件、接口、方法列表
多监听器
事件适配器
1、Event的含义
Events - 描述所发生事件的对象,Java中有很多不同类型的事件类,用来描述不同类型的用户动作
事件源 - 产生事件的组件
事件处理 - 一个接收事件对象并处理用户交互的方法
2、JDK1.0 与JDK1.2~事件处理机制
在JDK1.0中采用向上传递机制:
JDK1.2中的事件处理机制:
监听器:每个事件有一个相应的监听器接口,定义了接收事件的方法。实现该接口的类,可作为监听器注册。
每个组件都注册有一个或多个监听器(类),该监听器包含了能接收和处理事件的事件处理。
事件对象指向已注册的监听器报告。
包含事件处理的程序应该包括以下三部分内容:
1.在事件处理类的声明中指定要实现的监听器名,如:
public class MyClass implements ActionListener {
…
}
2.实现监听器中的接口,如:
public void actionPerformed(ActionEvent e) {
...//响应某个动作的代码...
}
3.在一个或多个组件上将监听器类的实例注册为监听器,如:someComponent.addActionListener(instanceOfMyClass);
3、事件分类
4、事件监听器接口
5、事件接口与方法目录
6、多监听器
在同一个组件上注册多个监听器。
根据需要多次调用addXXXListener() 方法注册多个监听器。
7、Event Adapters
Adapter类实现了相应Listener接口,但所有方法体都是空的。
用户可以把自己的监听器类声明为adapter类的子类,便可以只重写需要的方法。
8、使用内部类进行事件处理
既使用Adaptor类,又避免多重继承的限制。
——在一个类中定义内部类,由内部类继承相应Adaptor类。
匿名类(Anonymous Class)是没有名字的类。可以使用匿名内部类进行事件处理。
四、Swing组件
Swing包中定义了两类组件:
■ 顶层容器(JFrame,Japplet,Jwindow,Jdialog)
■ 轻型组件(‘J’开头的所有组件,如Jbutton,Jpanel,Jmenu等)
一般如果使用Swing组件,则程序中只使用Swing组件和Swing容器。