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被点击了 事件要结束了");
        }
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐