AWT
课程:1、GUI编程简介_哔哩哔哩_bilibili
一.介绍
- 包含了很多类和接口!GUI!
- 元素:窗口、按钮、文本框
- java.awt
二.窗口
1.构造
2.方法
// 实例化frame类
Frame frame = new Frame("这个一个框");
// 设置可见性
frame.setVisible(true);
// 设置窗口大小
frame.setSize(500, 500);
// 设置窗口背景颜色,实例化Color类
frame.setBackground(new Color(50, 70, 300));
// 设置窗口的弹出位置
frame.setLocation(300, 300);
// 设置窗口大小不可拖动改变
frame.setResizable(false);
效果:
问题:无法关闭窗口,停止java程序
多个frame
我们先写一个frame的封装类:
import java.awt.*;
public class MyFrame extends Frame {
// 静态序号,计算窗口个数
static int id = 0;
// 使用构造函数初始化弹出属性
// 初始化的属性有大小,弹出位置,背景颜色
public MyFrame(int x, int y, int w, int h, Color color) {
// 计算窗口个数
super("myFrame"+(++id));
// 设置窗口可视化
setVisible(true);
// 设置窗口大小与弹出位置,使用Bounds可以同时设置
setBounds(x, y, w, h);
// 设置窗口背景颜色
setBackground(color);
}
}
再写测试类:
public class Application {
public static void main(String[] args) {
MyFrame myFrame1 = new MyFrame(100, 100, 400, 400, Color.black);
MyFrame myFrame2 = new MyFrame(500, 100, 400, 400, Color.red);
MyFrame myFrame3 = new MyFrame(100, 500, 400, 400, Color.blue);
MyFrame myFrame4 = new MyFrame(500, 500, 400, 400, Color.green);
}
}
效果:
三.panel 面板
1.构造
2.方法
- frame中放置一个固定面板
// 先完成窗口的设置 Frame frame = new Frame(); frame.setVisible(true); frame.setBounds(300, 300, 500, 500); frame.setBackground(new Color(128, 253, 190)); // 将组件的布局设置为空布局,使你能够手动控制组件的位置和大小。 frame.setLayout(null); // 面板的设置与窗口一样,但是面板在窗口里面要注意位置与大小 // Panel是面板,可以放在窗口中,不能单独存在 Panel panel = new Panel(); frame.setVisible(true); panel.setBounds(50, 50, 400, 400); panel.setBackground(new Color(238, 47, 142)); // 添加面板进窗口, frame.add(panel);
效果:
解决无法关闭窗口停止java程序,可以使用下面的方法看不懂跳过后面还会再讲
package com.demo.panel;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class PanelTest {
public static void main(String[] args) {
panelTest();
}
public static void panelTest() {
// 先完成窗口的设置
Frame frame = new Frame();
frame.setVisible(true);
frame.setBounds(300, 300, 500, 500);
frame.setBackground(new Color(128, 253, 190));
// 将组件的布局设置为空布局,使你能够手动控制组件的位置和大小。
frame.setLayout(null);
// 面板的设置与窗口一样,但是面板在窗口里面要注意位置与大小
// Panel是面板,可以放在窗口中,不能单独存在
Panel panel = new Panel();
frame.setVisible(true);
panel.setBounds(50, 50, 400, 400);
panel.setBackground(new Color(238, 47, 142));
// 添加面板进窗口,
frame.add(panel);
// 设置窗口关闭,可以自己写一个窗口监听
// 监听事件:监听窗口关闭事件 关闭:System.exit(0)
// 适配器模式:用Adapter类重写方法 只有一个方法的监听接口没有适配器
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 窗口点击关闭的时候需要做的事,退出程序
System.exit(0);
}
});
}
}
四.四种布局管理器与按钮
按钮的构造器
Constructor and Description |
---|
Button() 构造一个带有标签的空字符串的按钮。 |
Button(String label) 构造具有指定标签的按钮。 |
方法
Modifier and Type | Method and Description |
---|---|
void | addActionListener(ActionListener l) 添加指定的动作侦听器以从此按钮接收动作事件。 |
void | addNotify() 创建按钮的对等体。 |
AccessibleContext | getAccessibleContext() 获取 |
String | getActionCommand() 返回此按钮触发的操作事件的命令名称。 |
ActionListener[] | getActionListeners() 返回在此按钮上注册的所有动作侦听器的数组。 |
String | getLabel() 获取此按钮的标签。 |
<T extends EventListener> | getListeners(类<T> listenerType) 返回当前注册为 |
protected String | paramString() 返回一个代表此 |
protected void | processActionEvent(ActionEvent e) 通过将此按钮分派到任何已注册的 |
protected void | processEvent(AWTEvent e) 处理此按钮上的事件。 |
void | removeActionListener(ActionListener l) 删除指定的动作侦听器,使其不再从此按钮接收到动作事件。 |
void | setActionCommand(String command) 设置此按钮触发的操作事件的命令名称。 |
void | setLabel(String label) 将按钮的标签设置为指定的字符串。 |
1.空布局(绝对布局)
前面我们使用的是空布局,如下
// 将组件的布局设置为空布局,使你能够手动控制组件的位置和大小。
frame.setLayout(null);
2.流式布局
从左到右从上到下
public static void main() {
Frame frame = new Frame();
// 按钮
Button button1 = new Button("按钮1");
Button button2 = new Button("按钮2");
Button button3 = new Button("按钮3");
// FlowLayout:流式布局 从左到右从上到下
// frame.setLayout(new FlowLayout(FlowLayout.LEFT));// 向左
// frame.setLayout(new FlowLayout()); // 中间
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));// 向右
// 设置可见度与大小
frame.setVisible(true);
frame.setSize(200,200);
// 添加按钮
frame.add(button1);
frame.add(button2);
frame.add(button3);
}
3.空间布局
东西南北中
public static void main() {
Frame frame1 = new Frame("BorderLayout布局");
// 组件--按钮
Button east = new Button("East");
Button west = new Button("West");
Button south= new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
// 设置可见度与大小
frame1.setVisible(true);
frame1.setSize(200,200);
// 添加按钮
// BorderLayout:空间布局 东西南北中 南北是拉满的 有南北的情况下左右不一定拉满了
frame1.add(east,BorderLayout.EAST);
frame1.add(west,BorderLayout.WEST);
frame1.add(south,BorderLayout.SOUTH);
frame1.add(north,BorderLayout.NORTH);
frame1.add(center,BorderLayout.CENTER);
}
4.网格布局
几行几列 根据多少,列会产生变化
public static void main() {
Frame frame2 = new Frame("GridLayout布局");
//组件--按钮
Button button1 = new Button("1");
Button button2 = new Button("2");
Button button3 = new Button("3");
Button button4 = new Button("4");
Button button5 = new Button("5");
Button button6 = new Button("6");
//设置布局GridLayout new GridLayout(行,列,行间隔,列间隔)
frame2.setLayout(new GridLayout(3,2));
// 设置可见度
frame2.setVisible(true);
// 添加按钮
frame2.add(button1);
frame2.add(button2);
frame2.add(button3);
frame2.add(button4);
frame2.add(button5);
frame2.add(button6);
// 使用pack()方法可以自动调节大小和布局大小
frame2.pack();
}
5.练习
请用30分钟做以下内容
思路讲解:6、课堂练习讲解及总结_哔哩哔哩_bilibili
public static void main() {
// 一.外层窗口
Frame frame3 = new Frame();
// 设置可见度,弹出位置,大小,颜色
frame3.setVisible(true);
frame3.setBounds(200,200,200,300);
frame3.setBackground(Color.BLACK);
// 设置布局
frame3.setLayout(new GridLayout(2,1));
// 二.设置四个面板
// 上面的面板
Panel p1 = new Panel(new BorderLayout());
// 上面中间的面板
Panel p2 = new Panel(new GridLayout(2,1));
// 下面的面板
Panel p3 = new Panel(new BorderLayout());
// 下面中间的面板
Panel p4 = new Panel(new GridLayout(2,2));
// 三.设计上面的面板
p1.add(new Button("上左"),BorderLayout.WEST);
p1.add(new Button("上右"),BorderLayout.EAST);
p2.add(new Button("上中一"));
p2.add(new Button("上中二"));
p1.add(p2,BorderLayout.CENTER);
// 四.设计下面的面板
p3.add(new Button("下左"),BorderLayout.WEST);
p3.add(new Button("下右"),BorderLayout.EAST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("for-"+i));
}
p3.add(p4,BorderLayout.CENTER);
// 五.将上下拼凑起来
frame3.add(p1);
frame3.add(p3);
frame3.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 窗口点击关闭的时候需要做的事,退出程序
System.exit(0);
}
});
}
由于中文的字符编码问题,我的结果中的中文没有显示出来,全部变成了正方形
五.事件监听
Modifier and Type | Method and Description |
---|---|
void | actionPerformed(ActionEvent e) 发生动作时调用。 |
1.按钮监听
package com.demo.panel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ActionEventTest {
public static void main(String[] args) {
actionEventTest();
}
// 事件监听 按下按钮 触发一些事件
public static void actionEventTest() {
// 1.窗口与布局
Frame frame = new Frame("开始-停止");
frame.setVisible(true);
frame.setLayout(new GridLayout(2,1));
// 2.按钮
Button button1 = new Button("start");
Button button2 = new Button("stop");
// 4.设置按钮信息
button1.setActionCommand("start");
// 5.实例化myMonitor与,两个按钮同用一个事件
myMonitor myMonitor = new myMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
// 6.按钮添加到窗口
frame.add(button1);
frame.add(button2);
frame.pack();
// 8.调用关闭窗口事件
windowClose(frame);
}
// 7.关闭窗口的事件,单独写成一个方法
private static void windowClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
// 3.按钮事件监听器,需要实现ActionListener接口,并重新actionPerformed方法
class myMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮button被点击了:"+e.getActionCommand());
}
}
2.输入框事件监听与文本框
Constructor and Description |
---|
TextField() 构造一个新的文本字段。 |
TextField(int columns) 构造具有指定列数的新的空文本字段。 |
TextField(String text) 构造一个使用指定文本初始化的新文本字段。 |
TextField(String text, int columns) 构造一个新的文本字段,并使用指定的文本进行初始化,以便显示,并且足够宽以容纳指定的列数。 |
方法摘要
Modifier and Type | Method and Description |
---|---|
void | addActionListener(ActionListener l) 添加指定的动作侦听器以从此文本字段接收动作事件。 |
void | addNotify() 创建TextField的对等体。 |
boolean | echoCharIsSet() 指示此文本字段是否具有用于回显的字符集。 |
AccessibleContext | getAccessibleContext() 获取与此TextField关联的AccessibleContext。 |
ActionListener[] | getActionListeners() 返回在此文本域中注册的所有操作侦听器的数组。 |
int | getColumns() 获取此文本字段中的列数。 |
char | getEchoChar() 获取要用于回显的字符。 |
<T extends EventListener> | getListeners(类<T> listenerType) 返回当前注册的所有对象的数组 |
Dimension | getMinimumSize() 获取此文本字段的最小尺寸。 |
Dimension | getMinimumSize(int columns) 获取具有指定列数的文本字段的最小尺寸。 |
Dimension | getPreferredSize() 获取此文本字段的首选大小。 |
Dimension | getPreferredSize(int columns) 使用指定的列数获取此文本字段的首选大小。 |
Dimension | minimumSize() 已弃用 从JDK 1.1版开始,替换为 |
Dimension | minimumSize(int columns) 已弃用 截至JDK 1.1版,由 |
protected String | paramString() 返回表示此 |
Dimension | preferredSize() 已弃用 从JDK 1.1版开始,由 |
Dimension | preferredSize(int columns) 已弃用 截至JDK 1.1版,由 |
protected void | processActionEvent(ActionEvent e) 通过将这些事件发送到任何已注册的 |
protected void | processEvent(AWTEvent e) 处理此文本字段上的事件。 |
void | removeActionListener(ActionListener l) 删除指定的动作监听器,使其不再从此文本字段接收到动作事件。 |
void | setColumns(int columns) 设置此文本字段中的列数。 |
void | setEchoChar(char c) 设置此文本字段的回音字符。 |
void | setEchoCharacter(char c) 已弃用 从JDK 1.1版开始,替换为 |
void | setText(String t) 将此文本组件呈现的文本设置为指定的文本。 |
package com.demo.panel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestTest01 {
public static void main(String[] args) {
// 调用构造器
new MyFrame();
}
}
class MyFrame extends Frame{
// 构造器(无参)
public MyFrame() {
//设置窗口的标题
//利用super访问父类构造方法
super("请输入密码");
TextField textField = new TextField();
// 因为继承了Frame,使用方法可以直接调用
add(textField);
//监听这个文本框输入的文字
textField.addActionListener(new MyActionListenerTextField());
// 设置替换编码
textField.setEchoChar('*');
// 设置窗口
setBounds(200,200,200,200);
setVisible(true);
}
}
class MyActionListenerTextField implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得一些资源,返回一个对象 向下转型获取事件源e.getSource()的返回值是object
TextField textField = (TextField) e.getSource();
// 获得输入框的文本
System.out.println(textField.getText());
// 换行清空与后台显示密码
textField.setText("");
}
}
3.练习简单加法计算器和标签
Constructor and Description |
---|
Label() 构造一个空标签。 |
Label(String text) 用指定的文本字符串构造一个新的标签,左对齐。 |
Label(String text, int alignment) 构造一个新的标签,以指定的对齐方式显示指定的文本字符串。 |
方法
void | addNotify() 创建此标签的对等体。 |
AccessibleContext | getAccessibleContext() 获取与此Label相关联的AccessibleContext。 |
int | getAlignment() 获取此标签的当前对齐方式。 |
String | getText() 获取此标签的文本。 |
protected String | paramString() 返回表示此 |
void | setAlignment(int alignment) 将此标签的对齐方式设置为指定的对齐方式。 |
void | setText(String text) 将此标签的文本设置为指定的文本。 |
package com.demo.panel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalcTest {
public static void main(String[] args) {
new MyCalcTest().loadFrame();
}
}
class MyCalcTest extends Frame{
// 调用父类构造设置标题
public MyCalcTest() {
super("简单加法计算器");
}
TextField num1,num2,num3;
public void loadFrame() {
// 设置小组件
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
// 布局
setLayout(new FlowLayout());
setVisible(true);
pack();
add(num1);
add(label);
add(num2);
add(button);
add(num3);
// 监听按钮
button.addActionListener(new MyCalcListener());
}
// 内部类实现监听
public class MyCalcListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// 实现加法,使用包装类将String类型转换成int
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
// 两数相加,回车输出结果
num3.setText(""+(n1+n2));
}
}
}
4.画笔paint
package com.demo.panel;
import java.awt.*;
public class PaintTest {
public static void main(String[] args) {
new MyPaintTest().loadPaint();
}
}
class MyPaintTest extends Frame{
// 画板
public void loadPaint() {
setTitle("Paint");
setBounds(200,200,600,500);
setVisible(true);
}
// 画笔,重写paint()方法
//画笔方法 paint创建窗口后,默认只执行一次
@Override
public void paint(Graphics g) {
// 选择颜色
g.setColor(Color.GREEN);
// 选择图像
g.fillOval(100,100,100,100);
// 养成习惯,画笔用完,将它还原成最初的颜色
g.setColor(Color.black);
}
}
5.鼠标监听与Point
Modifier and Type | Method and Description |
---|---|
void | mouseClicked(MouseEvent e) 在组件上单击(按下并释放)鼠标按钮时调用。 |
void | mouseEntered(MouseEvent e) 当鼠标进入组件时调用。 |
void | mouseExited(MouseEvent e) 当鼠标退出组件时调用。 |
void | mousePressed(MouseEvent e) 在组件上按下鼠标按钮时调用。 |
void | mouseReleased(MouseEvent e) 在组件上释放鼠标按钮时调用。 |
Constructor and Description |
---|
Point() 构造并初始化坐标空间原点(0,0)的点。 |
Point(int x, int y) 构造并初始化坐标空间中指定的 |
Point(Point p) 构造和初始化与指定的 |
方法
double | getX() 返回这个 |
double | getY() 返回这个 |
package com.demo.panel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class MouseListenerTest {
public static void main(String[] args) {
new MyFrame2("画画");
}
}
class MyFrame2 extends Frame{
// 需要一个集合来存储画笔画出点的(X,Y)坐标
ArrayList<Point> points;
// 设置画板(窗口)
public MyFrame2(String s) {
// 调用父类的构造器,参数为名字
super(s);
setBounds(200,200,400,300);
setVisible(true);
// 存储点的坐标
points = new ArrayList<>();
// 鼠标监听器,正对这个画板(窗口)
addMouseListener(new MyMouseListener());
}
// 画笔
@Override
public void paint(Graphics g) {
// 利用迭代器遍历,读取点的坐标
Iterator<Point> iterator = points.iterator();
while (iterator.hasNext()){
Point point=iterator.next();
// 设置颜色与点的大小
g.setColor(Color.PINK);
g.fillOval(point.x,point.y,10,10);
}
}
// 将点添加到画板上
public void addPaint(Point point) {
points.add(point);
}
// 适配器模式
private class MyMouseListener extends MouseAdapter{
// 鼠标监听事件:按下 弹起 按住不放
@Override
public void mousePressed(MouseEvent e) {
// 鼠标按下时,运行这个方法
MyFrame2 myFrame2=(MyFrame2) e.getSource();
// 添加画点坐标
myFrame2.addPaint(new Point(e.getX(),e.getY()));
//因为paint方法只会自动调用一次,所以通过repaint刷新后重新调用paint方法
//每次点击鼠标都需要重新画一次
repaint();
}
}
}
6.窗口监听
Modifier and Type | Method and Description |
---|---|
void | windowActivated(WindowEvent e) 当窗口设置为活动窗口时调用。 |
void | windowClosed(WindowEvent e) 当窗口关闭时调用窗口调用处理结果时调用。 |
void | windowClosing(WindowEvent e) 当用户尝试从窗口的系统菜单中关闭窗口时调用。 |
void | windowDeactivated(WindowEvent e) 当窗口不再是活动窗口时调用。 |
void | windowDeiconified(WindowEvent e) 当窗口从最小化更改为正常状态时调用。 |
void | windowIconified(WindowEvent e) 当窗口从正常状态更改为最小化状态时调用。 |
void | windowOpened(WindowEvent e) 第一次调用窗口可见。 |
package com.demo.panel;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class WindowTest {
public static void main(String[] args) {
new WindowFrame();
}
}
class WindowFrame extends Frame {
public WindowFrame() {
setBackground(Color.cyan);
setBounds(200, 200, 300, 200);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("点击x关闭");
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e) {
// 窗口激活事件:也就是当你点击到这个窗口内时,就是窗口激活了
// 鼠标点击窗口外的地方(窗口变灰了),也就是离开了窗口
WindowFrame source = (WindowFrame) e.getSource();
source.setTitle("被再次激活了");
System.out.println("windowActivated");
}
});
}
}
7.键盘监听
Modifier and Type | Method and Description |
---|---|
void | keyPressed(KeyEvent e) 按下键时调用。 |
void | keyReleased(KeyEvent e) 当键已被释放时调用。 |
void | keyTyped(KeyEvent e) 键入键时调用。 |
package com.demo.panel;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyListenerTest {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame() {
setBounds(200,200,200,200);
setVisible(true);
// 在这个窗口监听键盘事件
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 读取键盘
int keyCode = e.getKeyCode();
// 输出
System.out.println((char) keyCode);
// 如果按到a就fuck
if (keyCode == KeyEvent.VK_A ) {
System.out.println("fuck");
}
}
});
}
}