GUI
- 图形用户界面:是一个界面用图形的方式,来显示计算机操作的界面 更方便快捷
AWT
- 抽象窗口工具包:给用户提供基本的界面组件 eg:窗口 按钮 菜单 ——支持数据传输和图像操作
-
- 父Component:组件类——许多组件的父类
- 子1 Container:容器类—— 一种特殊组件 在可视区域内显示其他组件
组件不能独立显示 必须在Container里面才可见 - 子2 Button:按钮组件
- 子1孙1 Panel:面板——可作为容器容纳其他组件 不能独立存在 放在Frame中
- 子1孙2 Window:容器——独立存在
- 孙2孙孙 Frame:弹窗——可改变大小
Frame弹窗
frame.setVisible(true);——设置可见
frame.setSize(400,400);——设置窗口大小
frame.setBackground(new Color(85, 150, 68));——设置背景颜色
frame.setLocation(200,200);——设置初始位置
frame.setResizable(false);——设置大小不可变
public class Framedemo1 {
public static void main(String[] args) {
Frame frame = new Frame("我的第一个Java图像界面窗口");
frame.setVisible(true);
frame.setSize(400,400);
frame.setBackground(new Color(85, 150, 68));
frame.setLocation(200,200);
frame.setResizable(false);
}
}
Panel面板
缩放外层Frame窗口的大小时 内层Panel并不会随之改变大小
- 关闭窗口——监听事件
// 监听事件 ——监听窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override // 适配器模式
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
- 将面板放进窗口中——面板不能单独显示
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class PanelDemo {
public static void main(String[] args) {
Frame frame = new Frame("ZY的小窗口");
Panel panel = new Panel();
frame.setLayout(null); // 设置布局 null——默认布局
frame.setBounds(300,300,500,500); // 设置位置
frame.setBackground(new Color(22, 144, 151)); // 设置背景颜色
frame.setVisible(true);
frame.add(panel);
// 监听事件 ——监听窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override // 适配器模式
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
布局管理器
AWT提供了5种布局管理器类:
布局管理器:定位 设置大小
- FlowLayout——Panel类的默认布局管理器————流式布局
- 从左到右放置组件 不改变组件大小
- 可设置间距,行距以及默认对齐方式(默认是居中)
- 拉伸窗口后 按钮之间的间距 按钮大小不变
- BorderLayout——Frame类的默认布局管理器————东南西北中
- 将界面分为:东西南北中(默认为中)
- 拉伸窗口后 上下高度不变 左右宽度不变
- GridLayout布局管理器——————网格布局
- 将界面划分成规则的矩形网格,每个单元格区域大小相等。
- 组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下
- 在GridLayout构造方法中制定分割的行数和列数
- pack方法是使得Frame窗口刚好包住其中的元素的大小
- 拉伸窗口后 按钮大小改变 所有按钮大小均相同
注意:使用布局管理器时布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件大小和位置属性,如果试图用Java语言提供的setLocation(),setSize()等方法 都会被布局管理器覆盖
流式布局
frame.setLayout(new FlowLayout(FlowLayout.LEFT));——靠左放置
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));——靠右放置
frame.setLayout(new FlowLayout(FlowLayout.CENTER));——靠中间放置
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame();
Button button1 = new Button("A");
Button button2 = new Button("B");
frame.setLayout(new FlowLayout(FlowLayout.TRAILING));
frame.add(button1);
frame.add(button2);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() { ——————关闭弹窗
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
东南西北中
...
Button centerButton = new Button("CenterButton");
frame.add(eastButton, java.awt.BorderLayout.EAST);
...
frame.setVisible(true);
frame.setBounds(300,300,500,500);
网格布局
...
Button button9 = new Button("button9");
frame.setLayout(new GridLayout(3,3));
frame.add(button1);
...
frame.setVisible(true);
frame.pack();——————————————默认大小 使得窗口刚好包住按钮
练习
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test {
public static void main(String[] args) {
//四个面板
// 大面板分为两个 一上一下
// 两个小面板 上面的一分为二个按钮 下面的分为四个按钮
Frame frame = new Frame();
Panel panel1 = new Panel(new BorderLayout()); // 上面的大
Panel panel2 = new Panel(new GridLayout(2,1)); // 上面的小
Panel panel3 = new Panel(new BorderLayout()); // 下面的大
Panel panel4 = new Panel(new GridLayout(2,2)); // 下面的小
//上面
panel1.add(new Button("up-1"), BorderLayout.WEST);
panel1.add(new Button("up-2"), BorderLayout.EAST);
panel2.add(new Button("up-center-up"));
panel2.add(new Button("up-center-dw"));
panel1.add(panel2,BorderLayout.CENTER);
// 下面
panel3.add(new Button("dw-1"), BorderLayout.WEST);
panel3.add(new Button("dw-2"), BorderLayout.EAST);
panel4.add(new Button("dw-center-1"));
panel4.add(new Button("dw-center-2"));
panel4.add(new Button("dw-center-3"));
panel4.add(new Button("dw-center-4"));
panel3.add(panel4,BorderLayout.CENTER);
frame.add(panel1);
frame.add(panel3);
frame.pack(); // 自定义窗口大小
frame.setBounds(200,200,500,500);
frame.setLayout(new GridLayout(2,1)); // 整个窗口分为两个面板
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
事件监听
- 事件监听三元素:事件 事件源 监听器
- 事件:用户的一次操作 eg:点击一下鼠标 就是一个事件
- 事件源:产生事件的组件 ——事件产生的地方
- 监听器:监听事件源上发生事件 并作出各种相应的处理的对象
- 事件处理器:监听器对象对接收的事件对象进行相应处理的方法
适配器:监听器接口的默认实现类 实现了接口的所有方法 eg:WindowAdapter
注意:自定义一个监听器————class MyListener implements ActionListener
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ActionEventDemo {
public static void main(String[] args) {
Frame frame = new Frame();
Button button = new Button(); —————— 鼠标按下button 就是一个事件
MyListener myListener = new MyListener();
button.addActionListener(myListener); ———— 给button上一个监听器 需要一个类对象
frame.add(button, BorderLayout.CENTER); ——————事件发生源 就在窗口的按钮上
frame.setVisible(true);
frame.pack();
frame.addWindowListener(new WindowAdapter() { // 关闭窗口
@Override
public void windowClosing(WindowEvent e) {
System.out.println("事件结束了");
System.exit(0);
}
});
}
}
class MyListener implements ActionListener{ —————— 事件监听器
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是事件监听器——事件发生了 ");
}
}
若存在多个按钮时——给每个按钮另外设置一个名字——判断究竟选择的是哪个按钮——要用到setActioncommand();
当这个按钮被点击的时 用getActionCommand().equals(另外的名字) 比较触发事件的是不是这个按钮
......
Frame frame = new Frame("ZY的选择题");
Button button1 = new Button("ButtonA");
Button button2 = new Button("ButtonB");
MyListener2 myListener2 = new MyListener2();
button1.addActionListener(myListener2);
button2.addActionListener(myListener2);
button2.setActionCommand("GameOver");——————设置第二个名字
.......
if(e.getActionCommand().equals("ButtonA")){
System.out.println("按钮A被点击了");
}
if(e.getActionCommand().equals("GameOver")){————————用第二个名字进行比较
System.out.println("按钮B被点击了 事件要结束了");
}