• 学习java的第四十三天,GUI编程监听事件


    一、事件监听

    按钮监听1

    package src.com.lesson02;
    
    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(监听器)
            MyActionListener myActionListener = new MyActionListener();
            button.addActionListener(myActionListener);
            windowClose(frame);
            frame.add(button,BorderLayout.CENTER);  //在窗口上添加按钮,布局为东西南北中的中布局
            frame.pack();  //创建容器
            frame.setVisible(true);  //设置可见性
            frame.setBounds(300,300,400,500);
    
    
        }
        private static void windowClose(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    
    
    }
    class MyActionListener implements ActionListener{
        int i;
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("用户点击了按钮"+(++i)+"次");
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    结果图
    在这里插入图片描述

    按钮监听2

    package src.com.lesson02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class TestActionTow {
        public static void main(String[] args) {
            //两个按钮,实现同一个监听
            //开始  停止
            Frame frame = new Frame("测试开始与结束");
            frame.setBounds(200,300,200,300);
    
            Button button1 = new Button("start");
            Button button2 = new Button("stop");
            //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值!
            //可以多个按钮只写一个监听类!
            button1.setActionCommand("start");
            button2.setActionCommand("stop");
            MyMonitor myMonitor = new MyMonitor();
            button1.addActionListener(myMonitor);
            button2.addActionListener(myMonitor);
    
            frame.add(button1,BorderLayout.WEST);
            frame.add(button2,BorderLayout.EAST);
    
            frame.setVisible(true); //可见性
            frame.pack();   //适应大小
    
    
        }
    }
    class MyMonitor implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //e.getActionCommand()  获得按钮的信息
            System.out.println("按钮被点击了:msg--->"+e.getActionCommand());
            if (e.getActionCommand().equals("stop")){
                System.exit(0);
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    结果图

    在这里插入图片描述

    总结:图中结合了先前所学习到的事件监听,当用户点击的时候,则控制台输出总共点击了多少次

    二、输入框TextField监听

    
    package src.com.lesson02;
    
    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) {
            //启动!
            MyFram myFram = new MyFram();
    
        }
    }
    class MyFram extends Frame{
        public MyFram(){
            //创建文本输入框
            TextField textField = new TextField();
            add(textField);
    
            //监听这个文本框输入的文字
            MyActionListener2 myActionListener2 = new MyActionListener2();
            //按下enter  就会触发这个输入框的事件
            textField.addActionListener(myActionListener2);
            //设置替换编码
            textField.setEchoChar('*');
            //关闭窗口
            windowClose(this);
    
            setVisible(true);  //可见性
            pack();  //自适应
            setBounds(200,200,300,300);
        }
        public static void windowClose(MyFram myFram){
            myFram.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    
    }
    //监听器
    class MyActionListener2 implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
           TextField field = (TextField) e.getSource();  //获得一些资源,返回的一个对象
            System.out.println(field.getText());  //获得输入框的中文
            field.setText("");  //回车后为空
    
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    结果图

    在这里插入图片描述

    总结:在使用TextField文本框输出时,前台可以设置展示的信息为固定字符,然后后台可以看到用户输入的准确信息!

    三、简易加法计算器(组合+内部类回顾复习)

    重点OOP原则:组合大于继承

    3.1 不太规范的简易计算器

    package src.com.lesson02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    //测试简易计算器 3.1 不太规范的简易计算器
    public class TestCalc {
        public static void main(String[] args) {
            new Calculator();
        }
    }
    //计算器类
    class Calculator extends Frame{
    
    
        //构造器
        public Calculator(){
            super("3.1 不太规范的简易计算器");
            //3个文本框
            TextField num1 = new TextField(8);  //字符数
            TextField num2 = new TextField(8);  //字符数
            TextField num3 = new TextField(16);  //字符数
    
            //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);  //可见性
            //关闭窗口
            windowClose2(this);
    
        }
        public static void windowClose2(Calculator myFram){
            myFram.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
    
    
    //监听器类
    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("");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    3.2 完全改造为面向对象写法

    package src.com.lesson02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    //测试简易计算器 3.2 完全改造为面向对象写法
    public class TestCalcTow {
        public static void main(String[] args) {
            new Cortical().LoadFrame();
        }
    }
    //窗口计算器类
    class Cortical extends Frame{
        //属性
        TextField num1,num2,num3;
        //方法
        public void LoadFrame(){
            //1、三个文本框
             num1 = new TextField(8);
             num2 = new TextField(8);
             num3 = new TextField(18);
            //2、一个按钮
            Button button = new Button("=");
            button.addActionListener(new MyCalculatorTow(this));
    
            //3、一个标签
            Label label = new Label("+");
    
            //设置布局
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            setLayout(new FlowLayout());  //流式布局
            pack();  //自适应窗口
            setVisible(true);   //透明度
            StopTow(this); //关闭窗口
        }
    
        //关闭窗口的方法
        public static void StopTow (Cortical Myframe ){
            Myframe.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    
    }
    //监听器类
    
    class MyCalculatorTow implements ActionListener{
    
        Cortical cortical = null;
        //构造器
        public MyCalculatorTow(Cortical cortical) {
         this.cortical = cortical;
    
        }
        //计算类
        @Override
        public void actionPerformed(ActionEvent e) {
            //1、获得加数和被加数
            int n1 = Integer.parseInt(cortical.num1.getText());
            int n2 = Integer.parseInt(cortical.num2.getText());
            //2、将这个值 + 法运算后,放到第三个框
            cortical.num3.setText(""+(n1+n2));
            //3、清除这两个数
            cortical.num1.setText("");
            cortical.num2.setText("");
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    3.3 内部类写法:更好的包装

    package src.com.lesson02;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    //测试简易计算器 3.3 内部类写法:更好的包装
    public class TestCalcThree {
        public static void main(String[] args) {
    
            new CorticalThree().LoadFrameThree();
        }
    }
    
    //计算器类
    class CorticalThree extends Frame{
        //变量
        TextField num1,num2,num3;
    
        public void LoadFrameThree(){
            //1、设置3个文本框
            num1 = new TextField(8);
            num2 = new TextField(8);
            num3 = new TextField(16);
            //2、设置1个标签
            Label label = new Label("+");
            //3、设置1个按钮
            //按钮需要添加事件
            Button button = new Button("=");
            button.addActionListener(new MyCalculatorThree());
    
            //4、页面布局
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            setLayout(new FlowLayout());  //流式布局
            pack();  //自适应窗口
            setVisible(true);   //透明度
            StopThree(this); //关闭窗口
    
        }
        //监听器类 内部类
        //内部类最大的好处,就是可以畅通无阻的访问外部的属性和方法!
        private class MyCalculatorThree implements ActionListener{
            @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("");
            }
        }
        //关闭窗口的方法
        public static void StopThree (CorticalThree Myframe ){
            Myframe.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    结果图

    在这里插入图片描述

    四、画笔监听

    package src.com.lesson03;
    
    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,600,500);  //宽高
            setVisible(true);   //可见性
        }
        @Override
        public void paint(Graphics g) {
            //1、画笔,需要有颜色,画笔可以画画
            g.setColor(Color.red);
           // g.drawOval(100,100,100,100); //一个圆圈
            g.fillOval(100,100,100,100);  //实心圆圈
    
            g.setColor(Color.GREEN);
            g.fillRect(150,200,100,100);  //实心矩形
            //养成习惯,画笔用完,将它还原到最初的颜色
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    结果图

    在这里插入图片描述

    五、鼠标监听(重点)

    • 目的:想要实现鼠标画画!

    在这里插入图片描述

    package src.com.lesson03;
    //鼠标监听事件
    
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class TestMoyseListener {
        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());
        }
        //添加一个点到界面上  过度类
        public void  addPaint(Point point){
            points.add(point);
        }
    
        //适配器模式
        private class MyMouseListener extends MouseAdapter{
            //鼠标   按下,弹起,按住不放
            @Override
            public void mousePressed(MouseEvent e) {
                MyFrame myFrame = (MyFrame) e.getSource();
                //这里点击的时候就会在界面上产生一个点 ! 画
                //这个点就是鼠标的点
                myFrame.addPaint(new Point(e.getX(),e.getY()) );
    
                //每次点击鼠标都需要重画一次
                myFrame.repaint(); //刷新
            }
        }
    
        //鼠标监听事件类
        @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);  //设置出现的位置
            }
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    结果图
    在这里插入图片描述

    六、窗口监听(重点)

    package src.com.lesson03;
    
    import java.awt.*;
    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() {
            setBackground(Color.BLUE);  //设置背景颜色
            setBounds(100,100,400,200);
            setVisible(true);
            
            addWindowListener(
                    //匿名内部类
                    new WindowAdapter() {
                //关闭窗口
                @Override
                public void windowClosing(WindowEvent e) {
                    System.out.println("点击了关闭窗口");
                    System.exit(0);
                }
                        //激活窗口  windowsActivated
                        @Override
                        public void windowActivated(WindowEvent e) {
                            WindowFrame source = (WindowFrame) e.getSource();  //获取资源后强转类型
                            source.setTitle("被激活啦!");  //设置窗口当前的状态
                            System.out.println("点击了当前窗口!");
                        }
                        //窗口停用  windowsDeactivated
                        @Override
                        public void windowDeactivated(WindowEvent e) {
                            WindowFrame source = (WindowFrame) e.getSource();//获取资源后强转类型
                            source.setTitle("鼠标你去哪儿啦!快回来!"); //设置窗口当前的状态
                            System.out.println("离开了当前窗口!");
    
                        }
                    });
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    结果图

    在这里插入图片描述

    七、键盘监听(重点)

    package src.com.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){ //上键VK_XXX
                        System.out.println("您按下了上键");
                    }
                }
            });
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    结果图
    在这里插入图片描述

    总结:以上内容就是整个监听事件的重点了,虽然学习的过程所学的知识都有点杂乱,但是也更多的通过代码的方式去练习以及深入的理解,有些单词还是不需要去死记,而是通过肌肉记忆去记住就好了。


    注:文章仅做个人学习日记,不做学习建议,学习来源:狂神说

  • 相关阅读:
    宽带放大器设计举例
    【互联网程序设计】Java图形窗口程序设计
    百货店失去核心竞争力了吗?全靠超市即时零售撑起
    烽火推系统源码,抖音矩阵系统源码独立部署 TELL
    特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)
    什么是云服务器实例?实例的镜像,存储,安全分别是什么?
    基于springboot接口的编写
    【HMS Core】华为分析服务如何监听每个Flutter页面的使用时间?
    app全屏广告变现,有哪些利弊?如何发挥全屏广告的变现潜力?
    Flutter开发桌面应用的一些探索分享
  • 原文地址:https://blog.csdn.net/weixin_53830900/article/details/126432079