• GUI编程


    该怎么学?

    • 这是什么?
    • 如何使用?

    组件

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

    1. 简介

    Gui的核心技术: Swing AWT

    1. 因为界面不美观

    2. 需要jre环境

    为什么要学习?

    1. 可以写出自己心中想要的一些小工具
    2. 工作时候,也可能需要维护到Swing界面,概率极小
    3. 了解MVC架构,了解监听!

    2. AWT

    2.1 AWT介绍

    包含很难多累和接口!

    GUI 图形用户界面

    3. Swing

    代码

    第一个窗口

    package com.kuang.lesson;
    
    import java.awt.*;
    
    public class TestFrame {
    
        public static void main(String[] args){
    
            // Frame,  JDK , 看源码
            Frame frame = new Frame("我的第一个Java图形界面窗口");
    
            // 需要设置可见性
            frame.setVisible(true);
    
            // 设置窗口大小
            frame.setSize(400, 400);
    
            // 设置背景颜色
            frame.setBackground(new Color(86, 183, 232));
    
            // 弹出的初始位置
            frame.setLocation(200, 200);
    
            // 设置窗口大小固定
            frame.setResizable(false);
        }
    }
    
    

    显示多个窗口

    
    
    package com.kuang.lesson;
    
    import java.awt.*;
    
    public class TestFrame2 {
    
        public static void main(String[] args) {
            // 展示多个窗口
            MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.blue);
            MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.yellow);
            MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.white);
            MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.magenta);
        }
    
    }
    
    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);
            setBackground(color);
            setLocation(x, y);
            setSize(w, h);
            setResizable(false);
        }
    }
    

    面板 Panel

    面板解决了窗口关闭问题

    
    
    package com.kuang.lesson;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class TestPanel {
    
        public static void main(String[] args) {
            Frame frame = new Frame();
            Panel panel = new Panel();
    
            // 设置布局
            frame.setLayout(null);
    
            // 坐标
            frame.setBounds(300, 300, 500, 500);
            frame.setBackground(new Color(125, 125, 125));
    
            // Panel 设置坐标,相对于frame
            panel.setBounds(50, 50, 400, 400);
            panel.setBackground(new Color(86, 183, 232));
    
            // 将面板添加到窗口中
            frame.add(panel);
    
            frame.setVisible(true);
    
            // 监听事件,监听窗口关闭事件  System.exit(0)
            // 适配器模式
            frame.addWindowListener(new WindowAdapter() {
                // 窗口点击关闭的时候需要做的事情
                @Override
                public void windowClosing(WindowEvent e) {
                    // 结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    总结:
    1. Frame 是一个顶级窗口
    2. panel 无法单独显示
    3. 布局管理器
      1. 流式
      2. 东西南北中
      3. 表格
    4. 大小, 定位

    流式

    
    
    package com.kuang.lesson;
    
    import java.awt.*;
    
    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.RIGHT));
            //frame.setLayout(new FlowLayout(FlowLayout.LEFT));
    
            frame.setSize(200, 200);
    
            // 将按钮添加上去
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
    
            frame.setVisible(true);
    
        }
    }
    

    东西南北中

    package com.kuang.lesson;
    
    import java.awt.*;
    
    public class TestBoardLayout {
    
        public static void main(String[] args) {
            Frame frame = new Frame();
    
            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(200, 200);
            frame.setVisible(true);
        }
    }
    

    表格

    package com.kuang.lesson;
    
    import java.awt.*;
    
    public class TestGridLayout {
        public static void main(String[] args) {
            Frame frame = new Frame();
    
            Button btn1 = new Button("btn1");
            Button btn2 = new Button("btn2");
            Button btn3 = new Button("btn3");
            Button btn4 = new Button("btn4");
            Button btn5 = new Button("btn5");
            Button btn6 = new Button("btn6");
    
            frame.setLayout(new GridLayout(3,2));
    
            frame.add(btn1);
            frame.add(btn2);
            frame.add(btn3);
            frame.add(btn4);
            frame.add(btn5);
            frame.add(btn6);
    
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    4. 事件监听

    4.1 事件监听,触发事件,执行动作

    
    
    package com.kuang.lesson2;
    
    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();
    
            //因为,addActionlistener() 需要一个ActionListener, 所以我们需要有构造一个ActionListener
            MyActtionListener myActtionListener = new MyActtionListener();
    
            button.addActionListener(myActtionListener);
    
            frame.add(button, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
    
            windowClose(frame);
    
        }
    
        // 关闭窗体事件
        private static void windowClose(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
    class MyActtionListener implements ActionListener{
    
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("aaa");
        }
    }
    

    4.2 多个按钮共享一个事件

    package com.kuang.lesson2;
    
    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 TestActionEvent02 {
        public static void main(String[] args) {
            // 两个按钮,实现同一个监听事件
            // 开始   停止
            Frame frame = new Frame();
            Button button1 = new Button("start");
            Button button2 = new Button("stop");
    
            // 可以显示的定义出发会返回的命令,如果不显示定义,则会走默认的值
            // 可以多个按钮只写一个监听类
            button2.setActionCommand("button2-stop");
    
            MyMonitor myMonitor = new MyMonitor();
    
            button1.addActionListener(myMonitor);
            button2.addActionListener(myMonitor);
    
            frame.add(button1, BorderLayout.NORTH);
            frame.add(button2, BorderLayout.SOUTH);
    
            frame.pack();
            frame.setVisible(true);
    
            windowClose(frame);
    
    
        }
    
        private static void windowClose(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) {
            System.out.println("按钮被点击了: MSG " + e.getActionCommand());
        }
    }
    

    4.3 输入框 TextField 监听

    package com.kuang.lesson2;
    
    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 TestText01 {
        public static void main(String[] args) {
            // 启动
            MyFrame myFrame = new MyFrame();
            windowClose(myFrame);
        }
    
    
        // 关闭窗口事件
        private static void windowClose(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);
    
            // 监听这个文本框输入的文字
            MyActionListener02 myActionListener02 = new MyActionListener02();
            // 按下enter 就会触发这个输入框的事件
            textField.addActionListener(myActionListener02);
    
            setVisible(true);
            pack();
        }
    }
    
    class MyActionListener02 implements ActionListener{
    
        @Override
        public void actionPerformed(ActionEvent e) {
            TextField field = (TextField) e.getSource(); // 获得一些资源
            System.out.println(field.getText());// 获得输入框的文本
    
        }
    }
    

    4.4 简易计算器,组合+内部类回顾复习

    OOP 原则: 组合 > 继承

    class A extends B{
    
    }
    
    class A {
    	public B b;
    }
    

    实例: 计算器

    LOW

    package com.kuang.lesson2;
    
    
    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) {
            Calculator calculator = new Calculator();
            windowClose(calculator);
    
    
        }
    
        // 关闭窗口事件
        private static void windowClose(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);
            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("");
    
    
    
        }
    }
    

    高级写法 : 完全面向对象

    package com.kuang.lesson2;
    
    
    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) {
            Calculator calculator = new Calculator();
            calculator.loadFrame();
            windowClose(calculator);
    
    
        }
    
        // 关闭窗口事件
        private static void windowClose(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
        }
    }
    
    // 计算器类
    class Calculator extends Frame {
    
        // 属性
        TextField num1, num2, num3;
    
        // 方法
        public void loadFrame(){
    
            // 3个文本框
            TextField num1 = new TextField(10);
            TextField num2 = new TextField(10);
            TextField num3 = new TextField(20);
    
            // 1个按钮
            Button button = new Button("=");
            button.addActionListener(new MyCalculatorListener(this));
    
            // 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;
    
        // 获取计算机这个对象,在一个类中组合另外一个
        Calculator calculator = null;
    
        public MyCalculatorListener(Calculator calculator){
            this.calculator = calculator;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            //1. 获取加数和被加数
            //int n1 = Integer.parseInt(num1.getText());
            //int n2 = Integer.parseInt(num2.getText());
    
            int n1 = Integer.parseInt(calculator.num1.getText());
            int n2 = Integer.parseInt(calculator.num2.getText());
            //2. 将前两个值相加放到第三个框
            //num3.setText("" + (n1 + n2));
            calculator.num3.setText("" + (n1 + n2));
    
    
            //3. 清除前两个框
            //num1.setText("");
            //num2.setText("");
            calculator.num1.setText("");
            calculator.num2.setText("");
    
    
    
        }
    }
    
    

    匿名内部类

    package com.kuang.lesson2;
    
    
    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) {
            Calculator calculator = new Calculator();
            calculator.loadFrame();
            windowClose(calculator);
    
    
        }
    
        // 关闭窗口事件
        private static void windowClose(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
        }
    }
    
    // 计算器类
    class Calculator extends Frame {
    
        // 属性
        TextField num1, num2, num3;
    
        // 方法
        public void loadFrame(){
    
            // 3个文本框
            TextField num1 = new TextField(10);
            TextField num2 = new TextField(10);
            TextField num3 = new TextField(20);
    
            // 1个按钮
            Button button = new Button("=");
            button.addActionListener(new MyCalculatorListener());
    
            // 1个标签
            Label label = new Label("+");
            // 布局
            setLayout(new FlowLayout());
    
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
    
            pack();
            setVisible(true);
        }
    
    
        // 监听器类
        // 内部类的最大好处就是畅通无阻地访问外部属性和方法
        private class MyCalculatorListener implements ActionListener{
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
                //1. 获取加数和被加数
                //int n1 = Integer.parseInt(num1.getText());
                //int n2 = Integer.parseInt(num2.getText());
    
                int n1 = Integer.parseInt(num1.getText());
                int n2 = Integer.parseInt(num2.getText());
                //2. 将前两个值相加放到第三个框
                //num3.setText("" + (n1 + n2));
                num3.setText("" + (n1 + n2));
    
    
                //3. 清除前两个框
                //num1.setText("");
                //num2.setText("");
                num1.setText("");
                num2.setText("");
    
    
    
            }
        }
    
    
    
    }
    
    
    

    4.5 画笔

    package com.kuang.lesson03;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class TestPaint {
        public static void main(String[] args) {
    
            Mypaint mypaint = new Mypaint();
            mypaint.loadFrame();
            closeWindow(mypaint);
        }
    
        private static void closeWindow(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
        }
    }
    
    
    class Mypaint extends Frame {
    
        public void loadFrame(){
            setBounds(200,200, 600, 400);
            setVisible(true);
        }
    
        // 画笔
        @Override
        public void paint(Graphics g){
            // 画笔,需要有颜色,画笔可以画画
            g.setColor(Color.RED);
            // 空心圆
            g.drawOval(0, 0, 100, 100);
            // 实心圆
            g.fillOval(200, 200, 100 ,100);
    
            g.setColor(Color.GREEN);
            g.fillRect(0, 0, 100, 50);
        }
    }
    
    

    4.6 鼠标监听事件

    package com.kuang.lesson03;
    
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    // 鼠标监听事件
    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, 400, 300);
    
            // 存储鼠标点
            points = new ArrayList<>();
    
            setVisible(true);
            // 鼠标监听器,针对这个窗口
            this.addMouseListener(new MyMouseListener());
        }
    
        @Override
        public void paint(Graphics g){
            // 画画, 监听鼠标事件
            Iterator iterator = points.iterator();
            while(iterator.hasNext()){
                Point point = (Point) iterator.next();
                g.setColor(Color.BLUE);
                g.fillOval(point.x, point.y, 10, 10);
            }
        }
    
        // 添加一个点到界面上
        public void addPoint(Point point){
            points.add(point);
        }
    
        // 适配器模式
        private class MyMouseListener extends MouseAdapter{
            // 鼠标  按下, 弹起, 按住不放
            @Override
            public void mousePressed(MouseEvent e){
                MyFrame frame = (MyFrame)e.getSource();
                // 这个我们点击的的时候,就会在界面上产生一个点
                // 这个点就是鼠标的点
                frame.addPoint(new Point(e.getX(), e.getY()));
    
                // 每次点击鼠标都需要重新画一遍
                frame.repaint();//刷新
            }
        }
    }
    
    

    4.7 键盘监听

    package com.kuang.lesson03;
    
    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(1, 2, 300, 400);
            setVisible(true);
    
            this.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    // 获得当前键盘下地键是哪一个,当前的码
                    int keyCode = e.getKeyCode();
                    // 不用记这个值,直接静态属性  VK_XXX
                    System.out.println(keyCode);
                    if (keyCode == KeyEvent.VK_UP){
                        System.out.println("你按下了上键");
                    }
                    // 根据按下不同的操作,产生不同的结果
                }
            });
        }
    }
    
    
  • 相关阅读:
    Flex之五筒布局:想去哪儿就去哪儿 上手就会
    CSS画出三角形与圆形小技巧
    HTML table表格标签
    HTML 常用列表标签
    vue-learning:4-template-v-if-and-v-show
    vue-learning:3-template-{{}}-and-v-html
    vue-learning:2
    vue-learning:0
    vue-learning:1
    【转】像素 Pixel (Picture Element)
  • 原文地址:https://www.cnblogs.com/qianjunye/p/14393879.html
Copyright © 2020-2023  润新知