AWT(Abstract Window Toolkit) ,抽象窗口工具包, SUN 公司提供的用于图形界面编程 (GUI) 的类库。基本的 AWT 库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上( Windows 、 Unix 、 Macintosh —苹果操作系统等)的本地 GUI 工具进行处理。
容器里组件的位置和大小是由布局管理器来决定的。容器对布局管理器的特定实例保持一个引用。当容器需要定位一个组件时,它将调用布局管理器来完成。当决定一个组件的大小时,也是如此。
在 AWT 中,给我们提供了五种布局管理器:
BorderLayout FlowLayout GridLayout CardLayout GridBagLayout
AWT 事件模型
Events( 事件 ) :描述发生了什么的对象。
Event source( 事件源 ) :事件的产生器。
Event handlers( 事件处理器 ) :接收事件对象、解释事件对象并处理用户交互的方法。
事件监听器:实现了监听器接口的类。一个监听器对象是一个实现了专门的监听器接口的类的实例。
----------------------------------------------------------Frame-----------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class FrameTest {
public static void main(String args[]) throws IOException{
final Frame f=new Frame();
/* 在构造 FileDialog 文件对话框的对象时,参数部分调用了 Frame 窗体的对象 f
在方法当中,所定义的匿名内部类要访问外部的局部变量或者本地变量,需要将变量声明为 final
*/
System.out.println("======================== 设置窗体属性 ========================");
f.setSize(500, 400);
f.setLocation(420, 250);
f.setBackground(Color.GRAY);
f.setLayout(new BorderLayout(10,10));// 按照东南西北中 5 个方位排列,也是默认缺省的布局管理器
//f.setLayout(new FlowLayout(FlowLayout.CENTER));// 流式布局管理器
//f.setLayout(new GridLayout(3,3,10,10));// 网格状布局管理器
//f.setLayout(new CardLayout(10,10));// 卡片布局管理器
//f.setLayout(new GridBagLayout());//
System.out.println("======================== 给窗体添加按钮 ========================");
Button b1=new Button("North");
Button b2=new Button("South");
Button b3=new Button("West");
Button b4=new Button("East");
Button b5=new Button("Center");
f.add(b1,"North");
f.add(b2,"South");
f.add(b3,"West");
f.add(b4,"East");
f.add(b5,"Center");
f.addWindowListener(new WindowAdapter() {// 方法 1 WindowListener 事件,实现 Frame 窗体关闭操作
public void windowClosing(WindowEvent e) {
System.exit(0); //System 类的 exit 方法 终止当前正在运行的 Java 虚拟机
}
});
//f.addWindowListener(new WindowListenerMethod2()); // 调用方法 2 的 addWindowListener 方法
//f.addWindowListener(new WindowListenerMethod3()); // 调用方法 3 的 addWindowListener 方法
/*WindowListener 用于接收窗口事件的侦听器接口 , 需要处理窗口事件的类可以有 2 种方法
1. 实现 WindowListener 此接口
2. 扩展抽象类 WindowAdapter ,仅需要重写所需的方法
然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Frame 注册
当通过打开、关闭、激活或停用、图
标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,
并将 WindowEvent 传递给该方法 */
System.out.println("======================== 给窗体添加菜单 ========================");
MenuBar mb=new MenuBar();// 菜单栏
Menu m1=new Menu(" 文件 ");// 菜单
Menu m2=new Menu(" 编辑 ");
MenuItem mi1=new MenuItem(" 新建 ");// 菜单项
MenuItem mi2=new MenuItem(" 打开 ");
MenuItem mi3=new MenuItem(" 保存 ");
MenuItem mi4=new MenuItem(" 退出 ");
MenuItem mi5=new MenuItem(" 复制 ");
MenuItem mi6=new MenuItem(" 粘贴 ");
m1.add(mi1);
m1.add(mi2);
m1.add(mi3);
m1.add(mi4);
m2.add(mi5);
m2.add(mi6);
mb.add(m1);
mb.add(m2);
f.setMenuBar(mb);// 把菜单栏添加到 Frame 窗体中
System.out.println("====================== 添加只有一行的文本区 ======================");
TextField tf=new TextField(10);
f.add(tf,"North");
System.out.println("======================== 添加文本域 ========================");
final TextArea ta=new TextArea();
f.add(ta);
System.out.println("================= 以下为操作事件的侦听器接口 =================");
mi1.addActionListener(new ActionListener(){ // 新建
public void actionPerformed(ActionEvent e){
ta.setText(" ");
}
});
mi4.addActionListener(new ActionListener(){ // 为 " 退出 " 菜单项添加退出事件
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
f.setVisible(true);
}
}
class WindowListenerMethod2 implements WindowListener { // 方法 2
public void windowActivated(WindowEvent e) {
}
public void windowClosed(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowDeactivated(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
}
class WindowListenerMethod3 extends WindowAdapter // 方法 3
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
--------------------------------------------------------Panel--------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
public class PanelTest extends Frame
{
/*Panel 是最简单的容器类 , 也可以成为面板
应用程序可以将其他组件放在 Panel 提供的空间内,这些组件包括其他 Panel
Panel 的默认布局管理器是 FlowLayout 布局管理器
将多个 panel 放置在一个 Frame 中,每个 panel 可以使用一种布局,将每种布局的 panel 用一个方法来控制
*Frame 和 Panel 都属于 java.awt 类
*WindowListener 和 ActionListener 属于 java.awt.event 事件类
*
* */
private Panel borderPanel;
private Panel flowPanel;
private Panel gridPanel;
private Panel cardPanel;
public PanelTest(String title)
{
super(title); // 虽然 PanelTest 类已经继承 Frame 类,但设置标题还需要使用 super 调用父类的构造器设置标题
setSize(600,400); // 定义 Frame 窗体的大小
setLocation(100,100); // 定义 Frame 窗体从屏幕左上角起向右延伸的 xy 轴的位置
setBorderLayoutPanel(); // 初始化 4 个 Panel
setFlowLayoutPanel();
setGridLayoutPanel();
setCardLayoutPanel();
setLayout(new GridLayout(2,2)); // 定义整个 Frame 窗体使用网格状布局管理方式
add(borderPanel); // 添加所有的 Panel
add(flowPanel);
add(gridPanel);
add(cardPanel);
addWindowListener(new WindowAdapter() { //WindowListener 事件,实现 Frame 窗体关闭操作
public void windowClosing(WindowEvent e) {
System.exit(0); //System 类的 exit 方法 终止当前正在运行的 Java 虚拟机
}
});
}
public void setBorderLayoutPanel()
{
borderPanel=new Panel();
borderPanel.setLayout(new BorderLayout());
Button btn1=new Button("North");
Button btn2=new Button("South");
Button btn3=new Button("West");
Button btn4=new Button("East");
Button btn5=new Button("Center");
borderPanel.add(btn1,BorderLayout.NORTH);
borderPanel.add(btn2,BorderLayout.SOUTH);
borderPanel.add(btn3,BorderLayout.WEST);
borderPanel.add(btn4,BorderLayout.EAST);
borderPanel.add(btn5,BorderLayout.CENTER);
}
public void setFlowLayoutPanel()
{
flowPanel=new Panel();
Button btn1=new Button("mybole");
btn1.addActionListener(new ActionListener() { // 使用匿名内部类来实现 ActionListener 接口
/*ActionListener 用于接收操作事件的侦听器接口,对处理操作事件的类可以实现此接口
而使用该类创建的对象可使用组件的 addActionListener 方法向该组件注册
在发生操作事件时,调用该对象的 actionPerformed 方法。
*
* */
public void actionPerformed(ActionEvent e) {
Button b=(Button)e.getSource();
if(b.getLabel()=="mybole"){
b.setLabel("weixin");
}
else {
b.setLabel("mybole");
}
}
});
Button btn2=new Button("winsun");
flowPanel.add(btn1);
flowPanel.add(btn2);
}
public void setGridLayoutPanel()
{
gridPanel=new Panel();
gridPanel.setLayout(new GridLayout(2,2));
Button btn1=new Button("Button1");
Button btn2=new Button("Button2");
Button btn3=new Button("Button3");
Button btn4=new Button("Button4");
gridPanel.add(btn1);
gridPanel.add(btn2);
gridPanel.add(btn3);
gridPanel.add(btn4);
}
public void setCardLayoutPanel()
{
final CardLayout cl=new CardLayout();
cardPanel=new Panel();
cardPanel.setLayout(cl);
Button btn1=new Button(" 黑桃 A");
Button btn2=new Button(" 红桃 K");
ActionListener al=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
cl.next(cardPanel); //CardLayout 布局的 next() 方法 翻转到指定容器的下一张卡片
}
};
// 通过此事件 将完成在 CardLayout 布局的 Panel 中 按钮之间切换 ( 翻转 ) 的功能
btn1.addActionListener(al);
btn2.addActionListener(al);
cardPanel.add(btn1,"1");
cardPanel.add(btn2,"2");
}
public static void main(String[] args) throws HeadlessException
{
PanelTest pt = new PanelTest("http://www.mybole.com.cn");
pt.setVisible(true);
}
}