Java 基础 09. Java GUI

作者: yjtuuige | 来源:发表于2022-01-15 11:13 被阅读0次

    GUI 组件:

    • 窗口、弹窗、面板、文本框、列表框、按钮、图片、监听事件、鼠标、键盘事件、破解工具

    一、简介

    GUI 核心技术:Swing AWT

    • 界面不美观;
    • 需要 JRE 环境。

    为什么要学习?

    • 可以写出自己的小工具;
    • 工作时,可能会维护到 Swing 界面;
    • 了解 MVC 架构,了解监听。

    二、AWT

    1.Awt 简介(英文缩写:抽象的窗口工具)

    • 包含了很多类和接口!GUI:图形用户界面编程。
    • 元素:窗口、按钮、文本框
    • java.awt
    1. 组件和容器
    1. Frame
    • 实例 1:
    package com.xxx.gui;
    
    import java.awt.*;
    
    /**
     * GUI 界面
     */
    public class TestFrame {
        public static void main(String[] args) {
            // Frame
            Frame frame = new Frame("JAVA 图形界面");
            // 设置可见性
            frame.setVisible(true);
            // 设置窗口大小
            frame.setSize(300, 300);
            // 设置背景颜色 Color
            frame.setBackground(new Color(220, 218, 218));
            // 弹出的初始位置
            frame.setLocation(300, 200);
            // 设置大小固定
            frame.setResizable(false);
        }
    }
    
    • 问题:窗口不能闭,停止 Java 程序
    • 实例 2:调用封装类,创建多个窗口
    package com.xxx.gui;
    
    import java.awt.*;
    
    /**
     * 调用封装类,创建多个窗口
     */
    public class TestFrame02 {
        public static void main(String[] args) {
            MyFrame myFrame01 = new MyFrame(100, 100, 200, 200, Color.cyan);
            MyFrame myFrame02 = new MyFrame(300, 100, 200, 200, Color.blue);
            MyFrame myFrame03 = new MyFrame(100, 300, 200, 200, Color.gray);
            MyFrame myFrame04 = new MyFrame(300, 300, 200, 200, Color.MAGENTA);
        }
    }
    
    class MyFrame extends Frame {
        // 窗口计数器
        static int id = 0;
    
        /**
         * @param x
         * @param y
         * @param width
         * @param height
         * @param color
         */
        public MyFrame(int x, int y, int width, int height, Color color) {
            // 标题
            super("MyFrame" + (++id));
            // 坐标及大小
            setBounds(x, y, width, height);
            // 背景颜色
            setBackground(color);
            // 设置可见
            setVisible(true);
        }
    }
    
    2. 面板 Panel
    • panel 可以看成一个单独空间,但不能单独存在,需要放在 Frame 中
    • 实例:窗口中添加面板,并通过事件监听,解决窗口无法关闭问题
    package com.xxx.gui;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    //  panel 可以看成一个单独空间,但不能单独存在,需要放在 Frame 中
    public class TestPanel {
        public static void main(String[] args) {
            Frame frame = new Frame();
            // 布局的概念
            Panel panel = new Panel();
            // 设置布局
            frame.setLayout(null);
            // 设置窗口
            // 背景颜色
    //        frame.setBackground(Color.LIGHT_GRAY);
            frame.setBackground(new Color(221, 225, 225));
            //坐标及尺寸
            frame.setBounds(100, 100, 500, 500);
            // 设置 panel
            panel.setBackground(new Color(14, 203, 182));
            // 坐标为相对坐标(相对 Frame)
            panel.setBounds(50, 50, 300, 300);
            // panel 加入到 Frame 中
            frame.add(panel);
            // 设置可见
            frame.setVisible(true);
            // 监听事件,监听窗口关闭事件 System.exit(0)
            // 适配器模式
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭,需要做的事情
                @Override
                public void windowClosing(WindowEvent e) {
                    // 退出程序
                    System.exit(0);
                }
            });
        }
    }
    
    3. 布局管理器
    • 流式布局
    • 按钮 Button button = new Button("button");
    • 实例:
    package com.xxx.gui;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /**
     * 流式布局
     */
    public class TestFlowLayout {
        public static void main(String[] args) {
    
            Frame frame = new Frame("流式布局");
            // 组件:按钮
            Button button1 = new Button("button1");
            Button button2 = new Button("button2");
            Button button3 = new Button("button3");
            // 设置为流式布局(默认)
            frame.setLayout(new FlowLayout());  // 默认居中
    //        frame.setLayout(new FlowLayout(FlowLayout.LEFT)); 靠左
    //        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));    靠右
            frame.setSize(300, 300);
            // 添加按钮
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
    
            frame.setVisible(true);
    
            // 监听事件:适配器模式
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    // 退出程序
                    System.exit(0);
                }
            });
        }
    }
    
    • 东西南北中布局
    • 实例:
    package com.xxx.gui;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /**
     * 布局:东西南北中
     */
    public class TestBorderLayout {
        public static void main(String[] args) {
            Frame frame = new Frame("TestBorderLayout");
    
            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");
            // 按布局格式添加
            frame.add(east, BorderLayout.EAST);
            frame.add(west, BorderLayout.WEST);
            frame.add(south, BorderLayout.SOUTH);
            frame.add(north, BorderLayout.NORTH);
            frame.add(center, BorderLayout.CENTER);
    
            frame.setSize(300, 300);
            frame.setVisible(true);
            // 监听事件:适配器模式
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
    • 表格布局
    • 实例:
    package com.xxx.gui;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /**
     * 表格布局
     */
    public class TestGridLayout {
        public static void main(String[] args) {
            Frame frame = new Frame("TestGridLayout");
    
            Button button1 = new Button("button1");
            Button button2 = new Button("button2");
            Button button3 = new Button("button3");
            Button button4 = new Button("button4");
            Button button5 = new Button("button5");
            Button button6 = new Button("button6");
            // 设置布局 3行2列
            frame.setLayout(new GridLayout(3, 2));
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
            frame.add(button4);
            frame.add(button5);
            frame.add(button6);
    
    //        frame.setSize(350, 350);
            // Java 函数,自动布局
            frame.pack();
            frame.setVisible(true);
            // 监听事件:适配器模式
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    // 退出程序
                    System.exit(0);
                }
            });
        }
    }
    
    • 实例:布局嵌套
    package com.xxx.gui;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /**
     * 布局嵌套
     */
    public class ExDemo {
        public static void main(String[] args) {
            // 总 Frame
            Frame frame = new Frame("ExDemo");
            frame.setSize(500, 500);
            frame.setBackground(Color.lightGray);
    
            // 初始坐标位置
            frame.setLocation(300, 200);
            // 可见
            frame.setVisible(true);
            frame.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("EAST-1"), BorderLayout.EAST);
            p1.add(new Button("WEST-1"), BorderLayout.WEST);
            p1.add(p2, BorderLayout.CENTER);
            p2.add(new Button("p2-bnt1"));
            p2.add(new Button("p2-bnt2"));
            // 下面布局
            p3.add(new Button("EAST-2"), BorderLayout.EAST);
            p3.add(new Button("WEST-2"), BorderLayout.WEST);
            p3.add(p4, BorderLayout.CENTER);
            for (int i = 1; i <= 4; i++) {
                p4.add(new Button("p4-for-" + i));
            }
    
            frame.add(p1);
            frame.add(p3);
    
            // 自动布局
    //        frame.pack();
            // 监听事件(窗口关闭):适配器模式
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    

    总结:

    1. Frame 是一个顶级窗口;
    2. Panel 无法单独显示,必须添加到某个容器中。
    3. 布局管埋器
      1. 流式布局
      2. 东西南北中布局
      3. 表格布局
      4. 大小,定位,背景颜色,可见性,监听!
    4. 事件监听
    • 事件监听:当某个事情发生时,干什么?
    • 实例 1:
    package com.xxx.gui.demo02;
    
    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 TestActionEvent {
        public static void main(String[] args) {
            // 按下按钮,触发事件
            Frame frame = new Frame("事件监听");
            Button button = new Button("ActionEvent");
            // 因为 addActionListener() 需要一个 ActionListener,
            // 所以我们需要构造一个ActionListener
            MyActionListener myActionListener = new MyActionListener();
            button.addActionListener(myActionListener);
    
            frame.add(button, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
            // 关闭窗体
            windowsClose(frame);
        }
    
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    // 事件监听
    class MyActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("触发事件");
        }
    }
    
    • 实例 2:多个按钮,共享一个事件
    package com.xxx.gui.demo02;
    
    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 TestAction02 {
        public static void main(String[] args) {
            // 两个按钮,实现同一个监听
            // 开始   停止
            Frame frame = new Frame("开始-停止");
            Button start = new Button("start");
            Button stop = new Button("stop");
            // 可以显示的定义触发会返回的信息,如果不显示定义,则为默认值!
            // 可以多个按钮只写一个监听类!
            stop.setActionCommand("but-stop");
            MyMonitor myMonitor = new MyMonitor();
            // 共用一个事件
            start.addActionListener(myMonitor);
            stop.addActionListener(myMonitor);
    
            frame.add(start, BorderLayout.NORTH);
            frame.add(stop, BorderLayout.SOUTH);
            frame.pack();
            frame.setVisible(true);
            windowsClose(frame);
        }
    
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    class MyMonitor implements ActionListener {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // e.getActionCommand(); 获取按钮信息
    //        System.out.println("按钮被点击,msg:" + e.getActionCommand());
            if (e.getActionCommand().equals("start")) {
                System.out.println("开始按钮被点击");
            } else {
                System.out.println("停止按钮被点击");
            }
        }
    }
    
    5. 输入框(TextField)监听事件
    • 实例:
    package com.xxx.gui.demo02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /**
     * 输入框(TextField)监听事件
     */
    public class TestTextField {
        public static void main(String[] args) {
            // 启动
    //        MyFrame myFrame = new MyFrame();
    //        windowsClose(myFrame);
            windowsClose(new MyFrame());
        }
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    class MyFrame extends Frame {
        public MyFrame() {
            TextField textField = new TextField();
            add(textField);
            // 监听文本框的输入
            MyActionListener2 myActionListener2 = new MyActionListener2();
            // 按下回车,触发输入框事件
            textField.addActionListener(myActionListener2);
            // 设置替换编码
            textField.setEchoChar('*');
            pack();
            setVisible(true);
        }
    }
    // 文本框监听
    class MyActionListener2 implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 获得资源返回的对象(Object)
            TextField field = (TextField) e.getSource();    // 类型转换
            // 获得输入框中的文本
            System.out.println(field.getText());
            // 回车后,清空文本框
            field.setText("");
        }
    }
    
    6. 简易计算器:组合+内部类回顾
    • OOP 原则:组合,大于继承!
    // 继承
    class A extends B{
    }
    // 组合
    class A{
        public B b;
    }
    
    • 实例 1:简易计算器
    package com.xxx.gui.demo02;
    
    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 TestCalc {
        public static void main(String[] args) {
            windowsClose(new Calculator());
        }
    
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    // 计算器类
    class Calculator extends Frame {
        public Calculator() {
            // 3 个文本框
            TextField num1 = new TextField(10); // 10 字符数
            TextField num2 = new TextField(10);
            TextField num3 = new TextField(20);
            // 1 个按钮
            Button button = new Button("=");
            // 按钮添加监听
            button.addActionListener(new MyCalculatorListener(num1, num2, num3));
            // 1 个标签
            Label label = new Label("+");
            // 设置布局(流式)
            setLayout(new FlowLayout());
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            pack();
            setVisible(true);
        }
    }
    
    // 监听器类
    class MyCalculatorListener implements ActionListener {
        // 获取三个变量
        private TextField num1, num2, num3;
    
        public MyCalculatorListener(TextField num1, TextField num2, TextField num3) {
            this.num1 = num1;
            this.num2 = num2;
            this.num3 = num3;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // 1.获取加数和被加数
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());
    
            // 2.将两个值 + 法运算后,放到第三个框
            num3.setText("" + (n1 + n2));   // 转成字符串类
            // 3.清除前两个框
            num1.setText("");
            num2.setText("");
        }
    }
    
    • 实例 2:改为面向对象
    package com.xxx.gui.demo02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * 简易计算器
     */
    public class TestCalc {
        public static void main(String[] args) {
            new Calculator().loadFrame();
        }
    }
    
    // 计算器类
    class Calculator extends Frame {
        // 属性
        TextField num1, num2, num3;
    
        // 方法
        public void loadFrame() {
            // 3 个文本框、1 个按钮、1 个标签
            num1 = new TextField(10); // 10 字符数
            num2 = new TextField(10);
            num3 = new TextField(20);
            Button button = new Button("=");
            Label label = new Label("+");
    
            // 按钮添加监听
            button.addActionListener(new MyCalculatorListener(this));
    
            // 设置布局(流式)
            setLayout(new FlowLayout());
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            pack();
            setVisible(true);
        }
    }
    
    // 监听器类
    class MyCalculatorListener implements ActionListener {
        // 获取计算器对象(一个类中组合另一个类)
        Calculator calculator = null;
    
        public MyCalculatorListener(Calculator calculator) {
            this.calculator = calculator;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // 1.获取加数和被加数
            // 2.将两个值 + 法运算后,放到第三个框
            // 3.清除前两个框
            int n1 = Integer.parseInt(calculator.num1.getText());
            int n2 = Integer.parseInt(calculator.num2.getText());
            calculator.num3.setText("" + (n1 + n2));   // 转成字符串类
            calculator.num1.setText("");
            calculator.num2.setText("");
        }
    }
    
    • 实例 3:内部类(更好的方式)
    • 好处:就是可以畅通无阻的访问外部属性和方法!
    package com.xxx.gui.demo02;
    
    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 TestCalc {
        public static void main(String[] args) {
            new Calculator("简易计算器").loadFrame();
        }
    }
    
    // 计算器类
    class Calculator extends Frame {
        // 属性
        TextField num1, num2, num3;
    
        // 方法
        public void loadFrame() {
            // 3 个文本框、1 个按钮、1 个标签
            num1 = new TextField(10); // 10 字符数
            num2 = new TextField(10);
            num3 = new TextField(20);
            Button button = new Button("=");
            Label label = new Label("+");
    
            // 按钮添加监听
            button.addActionListener(new MyCalculatorListener());
    
            // 设置布局(流式)
            setLayout(new FlowLayout());
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            pack();
            setVisible(true);
            windowsClose(this);
        }
    
        // 监听器类(内部类方式)
        // 内部类最大的好处,就是可以畅通无阻的访问外部属性和方法!
        private class MyCalculatorListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 1.获取加数和被加数
                // 2.将两个值 + 法运算后,放到第三个框
                // 3.清除前两个框
                int n1 = Integer.parseInt(num1.getText());
                int n2 = Integer.parseInt(num2.getText());
                num3.setText("" + (n1 + n2));   // 转成字符串类
                num1.setText("");
                num2.setText("");
            }
        }
    
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    
        public Calculator(String title) {
            super(title);
        }
    }
    
    7. 画笔
    • 实例:
    package com.xxx.gui.demo03;
    
    import java.awt.*;
    
    /**
     * 画笔
     */
    public class TestPaint {
        public static void main(String[] args) {
            new MyPaint().loadFrame();
        }
    }
    
    // 窗口类
    class MyPaint extends Frame {
        public void loadFrame() {
            setBounds(200, 200, 500, 400);
            setVisible(true);
        }
    
        // 重写画笔方法
        @Override
        public void paint(Graphics g) {
            // 画笔颜色
            g.setColor(Color.RED);
            // 空心圆:起始坐标,长度,宽度
    //        g.drawOval(100, 100, 150, 150);
            g.fillOval(50, 50, 120, 120);   // 实心圆
            g.setColor(Color.GREEN);
            // 矩形
            g.fillRect(160, 160, 150, 150);
            // 养成习惯,画笔用完,恢复为初始颜色(黑色)
            g.setColor(Color.BLACK);
        }
    }
    

    鼠标监听

    • 实例:实现用鼠标画画。
    package com.xxx.gui.demo03;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * 鼠标监听:实现用鼠标画画
     * 1.鼠标监听:获取坐标
     * 2.将坐标存储到集合
     * 3.重写画笔方法,遍历每个坐标点,并画出
     */
    public class TestMouseListener {
        public static void main(String[] args) {
            new MyFrame("画图");
        }
    }
    
    // 自定义类
    class MyFrame extends Frame {
        // 需要画笔,以及监听鼠标当前位置,使用集合来存储每一个点
        ArrayList points;
    
        // 窗口:构造方法
        public MyFrame(String title) {
            super(title);
            setBounds(200, 200, 500, 400);
            setVisible(true);
            windowsClose(this);
    
            // 2.存:鼠标点击的坐标点,并提到方法外
            points = new ArrayList<>();
            // 鼠标监听器:正对这个窗口
            this.addMouseListener(new MyMouseListener());
        }
    
        // 重写画笔方法
        @Override
        public void paint(Graphics g) {
            // 3.画:监听鼠标事件(遍历存储到集合中的鼠标事件坐标点)
            Iterator iterator = points.iterator();
            while (iterator.hasNext()) {
                Point point = (Point) iterator.next();
                g.setColor(Color.BLUE);
                g.fillOval(point.x, point.y, 10, 10);
            }
        }
    
        // 2.自定义方法:添加一个点到集合 ArrayList points
        public void addPaint(Point point) {
            points.add(point);
        }
    
        // 鼠标监听:适配器模式
        private class MyMouseListener extends MouseAdapter {
            // 鼠标:按下、弹起、按住不放
            @Override
            public void mousePressed(MouseEvent e) {
                // 获取鼠标资源(Object)
                MyFrame myFrame = (MyFrame) e.getSource();  // 转换成 MyFrame 类
                // 1.获取:鼠标点击,就会在界面上产生一个点(鼠标坐标)
                // new Point(e.getX(), e.getY())
                // 通过自定义方法 addPaint(),将坐标存储添加到集合中
                myFrame.addPaint(new Point(e.getX(), e.getY()));
                // 每点击鼠标,重画一次
                myFrame.repaint();  // 刷新(帧)
            }
        }
    
        // 关闭窗体方法
        private static void windowsClose(Frame frame) {
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭时要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    

    窗口监听

    • 实例:
    package com.xxx.gui.demo03;
    
    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 TestWindow {
        public static void main(String[] args) {
            new WindowFrame("窗口监听");
        }
    }
    
    // 自定义类
    class WindowFrame extends Frame {
        public WindowFrame(String title) {
            super(title);
            setBackground(new Color(141, 234, 233));
            setBounds(100, 100, 300, 300);
            setVisible(true);
    //        // 内部类方式(窗口关闭)
    //        addWindowListener(new MyWindowListener());
    
            // 推荐:匿名内部类方式
            this.addWindowListener(new WindowAdapter() {
                // 窗口关闭
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
    
                // 窗口激活
                @Override
                public void windowActivated(WindowEvent e) {
                    WindowFrame source = (WindowFrame) e.getSource();
                    source.setTitle("窗口被激活");
                }
            });
        }
    
        // 内部类方式(窗口关闭)
    //    class MyWindowListener extends WindowAdapter {
    //        @Override
    //        public void windowClosing(WindowEvent e) {
    //            setVisible(false);  // 窗口隐藏
    //            System.exit(0); // 正常退出, 1 为非正常退出
    //        }
    //    }
    }
    

    键盘监听

    • 实例:
    package com.xxx.gui.demo03;
    
    import java.awt.*;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    
    /**
     * 键盘监听
     */
    public class TestKeyListener {
        public static void main(String[] args) {
            new KeyFrame();
        }
    }
    
    class KeyFrame extends Frame {
        public KeyFrame() {
            setBounds(100, 100, 300, 300);
            setVisible(true);
            this.addKeyListener(new KeyAdapter() {
                // 键盘按下
                @Override
                public void keyPressed(KeyEvent e) {
                    // 获取键盘按下,当前键的码
                    int keyCode = e.getKeyCode();
                    // 可以直接使用静态属性
                    if (keyCode == KeyEvent.VK_UP) {
                        System.out.println("按下了向上键");
                    }
                    System.out.println(keyCode);
                    // 根据按下的键不同,产生不同的结果
                }
            });
        }
    }
    

    三、Swing

    1. 窗口、面板
    package com.xxx.gui.demo04;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * Swing 窗口、面板
     */
    public class JFrameDemo {
        public static void main(String[] args) {
            // 建立一个窗口
            new MyJFrame().init();
        }
    }
    
    class MyJFrame extends JFrame {
        // init(); 初始化
        public void init() {
            // 顶级窗口
            this.setBounds(100, 100, 300, 300);
            this.setVisible(true);
            JLabel jLabel = new JLabel("JLabel");
            // 文本标签居中,设置水平对齐
            jLabel.setHorizontalAlignment(SwingConstants.CENTER);
            this.add(jLabel);
    
            // 获得一个容器(颜色必须在容器中设置)
            Container container = this.getContentPane();
            container.setBackground(Color.CYAN);
            // 关闭事件
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
    

    2.JDialog 弹窗

    • 用来被弹出,默认自带关闭事件
    • 实例:
    package com.xxx.gui.demo04;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * JDialog 弹窗
     */
    // 主窗口
    public class DialogDemo extends JFrame {
        public DialogDemo() {
            this.setSize(500, 300);
            this.setVisible(true);
            // 关闭
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            // JFrame 容器:放置组件
            Container container = this.getContentPane();
            // 绝对布局
            container.setLayout(null);
            // 按钮
            JButton button = new JButton("点击弹出对话框");
            // 位置相对于 JFrame 容器
            button.setBounds(30, 30, 200, 50);
            // 按钮监听器:点击弹出窗口
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // 弹窗
                    new MyDialogDemo();
                }
            });
            container.add(button);
        }
    
        public static void main(String[] args) {
            new DialogDemo();
        }
    }
    // 弹窗窗口
    class MyDialogDemo extends JDialog {
        public MyDialogDemo() {
            this.setBounds(300, 200, 300, 200);
            this.setVisible(true);
            // 报错(重复):JDialog 默认已包含
            // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            Container container = this.getContentPane();
            container.setLayout(null);
            JLabel label = new JLabel("弹窗窗口");
            label.setBounds(10, 10, 50, 50);
            container.add(label);
        }
    }
    
    1. 标签
    • 实例 1:图标
    package com.xxx.gui.demo04;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 标签:Icon
     */
    // 图标(接口),需要实现类,继承 JFrame
    public class IconDemo extends JFrame implements Icon {
        private int width;
        private int height;
    
        // 无参构造
        public IconDemo() {
        }
    
        // 带参构造
        public IconDemo(int width, int height) {
            this.width = width;
            this.height = height;
        }
    
        // 初始化
        public void init() {
            IconDemo iconDemo = new IconDemo(15, 15);
            // 图标可以放在标签,也可以放在按钮上
            JLabel label = new JLabel("iconTest", iconDemo, SwingConstants.CENTER);
            Container container = getContentPane();
            container.add(label);
            this.setVisible(true);
            this.pack();
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new IconDemo().init();
        }
    
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            g.fillOval(x, y, width, height);
        }
    
        @Override
        public int getIconWidth() {
            return this.width;
        }
    
        @Override
        public int getIconHeight() {
            return this.height;
        }
    }
    
    • 实例 2:图片
    package com.xxx.gui.demo04;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    /**
     * 标签:图片
     */
    public class ImageIconDemo extends JFrame {
        public ImageIconDemo() {
            JLabel label = new JLabel("ImageIcon");
            // 获取图片地址
            URL url = ImageIconDemo.class.getResource("logo.png");
            ImageIcon imageIcon = new ImageIcon(url);
            // 标签设置图片
            label.setIcon(imageIcon);
            // 居中
            label.setHorizontalAlignment(SwingConstants.CENTER);
            Container container = getContentPane();
            container.add(label);
            setVisible(true);
            pack();
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new ImageIconDemo();
        }
    }
    
    1. 面板:JPanel
    • 实例:
    package com.xxx.gui.demo05;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 面板:JPanel
     */
    public class JPanelDemo extends JFrame {
    
        public JPanelDemo() {
            Container container = this.getContentPane();
            // 表格布局:两行一列,间距都为10
            container.setLayout(new GridLayout(2, 1, 10, 10));
    
            JPanel panel1 = new JPanel(new GridLayout(1, 3));
            JPanel panel2 = new JPanel(new GridLayout(1, 2));
            JPanel panel3 = new JPanel(new GridLayout(2, 1));
            JPanel panel4 = new JPanel(new GridLayout(2, 2));
            for (int i = 0; i < 3; i++) {
                panel1.add(new JButton("1"));
            }
            for (int i = 0; i < 2; i++) {
                panel2.add(new JButton("2"));
            }
            for (int i = 0; i < 2; i++) {
                panel3.add(new JButton("3"));
            }
            for (int i = 0; i < 6; i++) {
                panel4.add(new JButton("4"));
            }
            container.add(panel1);
            container.add(panel2);
            container.add(panel3);
            container.add(panel4);
    
            this.setVisible(true);
            this.setSize(300, 300);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new JPanelDemo();
        }
    }
    
    1. 边框:JScroll
    • 实例:
    package com.xxx.gui.demo05;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 边框:JScroll
     */
    public class JScrollDemo extends JFrame {
        public JScrollDemo() {
            Container container = this.getContentPane();
            // 文本域(可换行)
            JTextArea textArea = new JTextArea(20, 50);
            textArea.setText("这是文本域!!");
            // JScroll 面板
            JScrollPane scrollPane = new JScrollPane(textArea);
            container.add(scrollPane);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new JScrollDemo();
        }
    }
    
    1. 按钮
    • 实例:图标按钮
    package com.xxx.gui.demo05;
    
    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    
    /**
     * 按钮: 图标按钮
     */
    public class JButtonDemo extends JFrame {
        public JButtonDemo() {
            Container container = this.getContentPane();
            // 获取图片地址
            URL url = JButtonDemo.class.getResource("logo.png");
            // 把图片转换为图标
            Icon icon = new ImageIcon(url);
            // 把图标放在按钮上
            JButton button = new JButton();
            button.setIcon(icon);
            // 提示文字
            button.setToolTipText("提示文字:图片按钮");
            // 按钮添加到容器中
            container.add(button);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new JButtonDemo();
        }
    }
    
    • 实例:单选框
    package com.xxx.gui.demo05;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 单选框
     */
    public class JButtonDemo02 extends JFrame {
        public JButtonDemo02() {
            Container container = this.getContentPane();
            // 单选框
            JRadioButton radioButton1 = new JRadioButton("JRadioButton01");
            JRadioButton radioButton2 = new JRadioButton("JRadioButton02");
            JRadioButton radioButton3 = new JRadioButton("JRadioButton03");
            // 单选框只能选择一个,需要将其分成一组,每组中只能选择一个
            ButtonGroup group = new ButtonGroup();
            group.add(radioButton1);
            group.add(radioButton2);
            group.add(radioButton3);
    
            container.add(radioButton1, BorderLayout.NORTH);
            container.add(radioButton2, BorderLayout.CENTER);
            container.add(radioButton3, BorderLayout.SOUTH);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new JButtonDemo03();
        }
    }
    
    • 实例:多选框
    package com.xxx.gui.demo05;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 多选按钮
     */
    public class JButtonDemo03 extends JFrame {
        public JButtonDemo03() {
            Container container = this.getContentPane();
            // 多选框
            JCheckBox checkBox1 = new JCheckBox("checkBox01");
            JCheckBox checkBox2 = new JCheckBox("checkBox02");
    
            container.add(checkBox1, BorderLayout.NORTH);
            container.add(checkBox2, BorderLayout.SOUTH);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new JButtonDemo03();
        }
    }
    
    1. 列表
    • 实例:下拉框
    package com.xxx.gui.demo06;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 列表:下拉框
     */
    public class ComboboxDemo extends JFrame {
        public ComboboxDemo() {
            Container container = this.getContentPane();
            // 下拉框
            JComboBox status = new JComboBox();
            status.addItem(null);
            status.addItem("下拉内容1");
            status.addItem("下拉内容2");
            status.addItem("下拉内容3");
            container.add(status);
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new ComboboxDemo();
        }
    }
    
    • 实例:列表框
    package com.xxx.gui.demo06;
    
    import javax.swing.*;
    import java.awt.*;
    import java.util.Vector;
    
    /**
     * 列表框
     */
    public class ComboboxDemo02 extends JFrame {
        public ComboboxDemo02() {
            Container container = this.getContentPane();
            // 列表框
            // 生成列表的内容
    //        String[] contents = {"1", "2", "3"};  数组
            // 集合方式,可以动态添加列表内容
            Vector contents = new Vector();
    
            JList jList = new JList(contents);
            contents.add("列表内容1");
            contents.add("列表内容2");
            contents.add("列表内容3");
            container.add(jList);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new ComboboxDemo02();
        }
    }
    
    • 应用场景
      • 选择地区,或者一些单个选项;
      • 列表:展示信息,一般是动态扩容!
    1. 文本框
    • 实例:文本框
    package com.xxx.gui.demo06;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 文本框
     */
    public class TextDemo01 extends JFrame {
        public TextDemo01() {
            Container container = this.getContentPane();
            // 文本框
            JTextField textField1 = new JTextField("hello");
            JTextField textField2 = new JTextField("world", 20);
            container.add(textField1, BorderLayout.NORTH);
            container.add(textField2, BorderLayout.SOUTH);
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new TextDemo01();
        }
    }
    
    • 实例:密码框
    package github.GUI.Demo06;
    import javax.swing.*;
    import java.awt.*;
    /**
     * @author subeiLY
     * @create 2021-06-05 16:37
     */
    // 密码框
    public class TestTextDemo02 extends JFrame {
        public TestTextDemo02(){
            Container container = this.getContentPane();
            JPasswordField passwordField = new JPasswordField();
            passwordField.setEchoChar('*');
            container.add(passwordField);
            this.setVisible(true);
            this.setSize(500,500);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            new TestTextDemo02();
        }
    }
    
    • 实例:文本域
    package com.xxx.gui.demo06;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 文本域
     */
    public class TextDemo03 extends JFrame {
        public TextDemo03() {
            Container container = this.getContentPane();
            // 文本域(可换行)
            JTextArea textArea = new JTextArea(20, 50);
            textArea.setText("这是文本域!!");
            // JScroll 面板
            JScrollPane scrollPane = new JScrollPane(textArea);
            container.add(scrollPane);
    
            this.setVisible(true);
            this.setBounds(100, 100, 300, 200);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new TextDemo03();
        }
    }
    

    综合实例:贪吃蛇游戏

    相关文章

      网友评论

        本文标题:Java 基础 09. Java GUI

        本文链接:https://www.haomeiwen.com/subject/qrgxcrtx.html