AWT和Swing
AWT
重量级控件,实际上是在利用操作系统所提供的图形库。
Swing
轻量级控件,用纯粹的Java代码实现的。
AWT与Swing的区别
AWT是基于本地方法的C/C++程序,而Swing是基于AWT的Java程序;
Swing组件在实现时不包含任何本地代码。
容器
提到容器,首先就需要提到一个很重要的概念————组件。组件可以分为
- 基本组件
- 容器组件
- 顶层容器
- 中间容器
顶层容器
指可以独立使用的容器,包括JFrame(独立窗口,带标题和控制按钮),JDialog(对话框),JWindow(独立窗口,不带标题行和控制按钮)。
内容窗格
每一个顶层容器都有一个内容窗格。将组件放入内容窗格有两种方法:
- 通过顶层容器的getContentPane()方法获取默认的内容窗格,然后向其中添加组件。
- 创建新的内容窗格取代顶层容器默认的内容窗格。
面板(panel)
面板JPane属于中间容器,不能独立存在但可以嵌套。
布局
容器中放置组件,而组件的布局(位置和大小)通常由布局管理器负责安排。
// 获取JFrame容器默认的内容窗格
Container contentPane = frame.getContentPane();
// 为默认内容窗格设置FlowLayout布局管理器
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 40));
FlowLayout布局管理器
组件逐个放置,一行放满另起一行。
BorderLayout布局管理器
容器被划分为North,South,West,East,Center五个区域,每一个区域都可以加入一个组件。
构造方法:public BorderLayout(int hgap, int vgap);
GridLayout布局管理器
容器空间被划分为若干行×若干列的网格,组件依次放入其中。
构造方法:public GridLayout(int rows, int cols, int hgap, int vgap);
CardLayout布局管理器
将容器中的组件看作一些列卡片,卡片的顺序由组件在容器中放置的顺序决定,每一次只能从这些卡片中选择一张来显示。
public void show(Container parent, String name);
public void first(Container parent);
public void next(Container parent);
public void previous(Container parent);
public void last(Container parent);
BoxLayout布局管理器
构造方法:public BoxLayout(Container target, int axis);
axis指明组件的排列方向。BoxLayout.X_AXIS,BoxLayout.Y_AXIS分别表示水平方向排列和垂直方向排列。
事件处理
事件
每个事件发生时,该事件都用一个事件对象来表示,而事件对象都有对应的事件类。
每一类事件还对应一个监听程序接口,规定了接收并处理该类事件的方法规范。
事件源:产生事件的组件就是事件源。
事件监听器类:检查事件是否发生,如果发生就激活事件处理器并且进行处理的类。
事件监听器类必须实现事件监听器接口或者继承事件监听器适配器类。
前者定义了处理事件必须实现的方法;后者是对事件监听器接口的简单实现。
事件监听器的注册
在事件源上注册事件监听器,以在事件被激活时事件处理器进行相应的处理。
事件监听器类必须包括一下两部分内容:
- 类的声明中指定要实现的监听器接口名
实现监听器接口中的事件处理方法
然后,在一个或者多个组件上可以进行监听器类实例的注册
组件对象.addXXXListener(MyListener对象);
public class ActionEventDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("ActionEvent Demo");
// 事件源是一个按钮
JButton b = new JButton("Press me");
// 注册事件监听器
b.addActionListener(new ButtonHandler());
frame.getContentPane().add(b, BorderLayout.CENTER);
frame.setSize(200, 100);
frame.setVisible(true);
}
}
// 事件监听器类
class ButtonHandler implements ActionListener {
// 事件处理器,出现ActionEvent事件时(接收事件),该方法被调用
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
- 单击鼠标事件监听器类(实现监听器类)
public class MouseClickHandler implements MouseListener {
public void mouseClicked(MouseEvent e) {
}//...
// 其他方法,仍然需要给出实现
public void mousePressed(MouseEvent e) {}
// …
} - 单击鼠标事件监听器类(继承适配器)
class MouseClickHandler1 extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
}// 处理代码...
}