Day17——GUI之AWT

AWT

1. 概述

1.1 GUI

图形用户界面(Graphics User Interface, GUI)是指为程序提供直观的图形界面,最终用户通过鼠标拖动、单击等动作就可以操作的整个应用;

1.2 AWT

抽象窗口工具集(Abstract Windows Toolkit,AWT)是最原始的Java GUI工具包;提供了一些基本的功能;

1.2.1 优点
  1. AWT在Java的每个版本都成为了一种标准配置,意味着我们不需要单独安装这个工具包,在任何一个Java运行环境中都可以使用它;
  2. 非常稳定;
  3. 简单、高效;
  4. 运行速度快;
1.2.2 缺点
  1. 消耗资源;
  2. 难以跨平台;

2. 功能

在这里插入图片描述

2.1 容器

​ 任何窗口都可以被分解成一个空的容器,容器里边盛装了大量的基本组件,通过设置这些基本组件的大小,位置等属性,就可以将该容器和基本的组件组成一个整体的窗口;

2.1.1 窗口(Frame)

Frame代表常见的窗口,它是Window类的子类

  1. 通过Frame创建一个窗口:
import java.awt.Color;
import java.awt.Frame;

/*
通过Frame创建一个窗口
 */
public class Demo01Frame {
    public static void main(String[] args) {
        //创建窗口对象
        Frame frame = new Frame("我的第一个Java图像界面窗口");
        //设置窗口大小
        frame.setSize(400, 400);
        //设置窗口弹出的初始位置
        frame.setLocation(200, 200);
        /*      
        //上述两个功能可以用一个功能代替
        frame.setBounds(200, 200, 400, 400);
        */

        //设置背景颜色
        frame.setBackground(Color.PINK);

        //设置大小固定,不可更改
        frame.setResizable(false);

        //设置可见性,
        frame.setVisible(true);
    }
}

  1. 结果:
    在这里插入图片描述

  2. 分析:

    此例子只是生成了一个窗口,并不能响应用户的操作,即使单击窗口右上方的关闭按钮,也是不可以关闭窗口大的,实现关闭的代码,在之后的内容将会涉及;

2.1.2 面板(Panel)

​ 与Frame不同的是,Panel不能作为最外层的容器单独存在,它首先必须作为一个组件放在其他容器中,然后再把它当做容器,把其他组件放在它里面;

  1. 通过Panel来解决关闭事件;

    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Panel;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /*
    通过Panel来解决关闭事件;
     */
    public class Demo02Panel {
        public static void main(String[] args) {
            //创建窗口对象
            Frame frame = new Frame();
            //创建一个Panel容器,来实现事件监听
            Panel panel = new Panel();
    
            //设置布局
            /*
            此处为什么要有这个语句?具体原因我也不是很清楚,查了资料之后,我是这样理解的
            Frame实现布局的默认是BorderLayout(之后会讲),而Panel实现布局默认的是FlowLayout;
            如果不将Frame布局取消,那么Panel作为组件就会被使用默认布局来布局,就算设置了Panel的初始位置,也没有用;
             */
            frame.setLayout(null);
    
            //frame属性设置
            frame.setBounds(200,200,400,400);
            frame.setBackground(Color.WHITE);
    
            //Panel属性设置:相对于frame
            panel.setBounds(50,50,300,300);
            panel.setBackground(Color.PINK);
    
            //因为Panel不可单独存在,故而需要将其加入frame窗口
            frame.add(panel);
    
            //可视化
            frame.setVisible(true);
    
            //监听事件,监听窗口关闭事件
            //适配器模式
            frame.addWindowListener(new WindowAdapter() {
                //窗口点击关闭时需要做的事
                @Override
                public void windowClosing(WindowEvent e) {
                    //结束程序
                    System.exit(0);
                }
            });
        }
    }
    
    
  2. 结果:

    1. 不加取消布局:
      在这里插入图片描述

    2. 加取消布局:frame.setLayout(null);
      在这里插入图片描述

2.2布局管理器
2.2.1 概述

java的awt包中定义了许多GUI组件,如按钮、标签、文本框等,这些组件一般放在Frame、Panel容器中进行管理。容器中的组件大小、位置、排列方式等属性统称为容器的布局。在java中提供了布局管理器对容器中的布局进行管理

2.2.2 分类

常见的布局管理器及其显示特性如下表:
在这里插入图片描述

每个容器都有一个默认的布局管理器:

  • Frame、Window、Dialog默认为:BorderLayout;
  • Panel、Applet默认为:FlowLayout;

注:容器的布局管理器必须在添加任何组件之前添加;

  1. FlowLayout(流式布局):

    流式布局是最简单的布局管理器,组件按照添加的顺序,从左到右排列,一行排满之后,重新开始下一行;用户无法手动换行;

  • FlowLayout中定义的对齐方式:
//一般默认是居中对齐

FlowLayout.LEFT //左对齐
FlowLayout.RIGHT //右对齐
FlowLayout.CENTER //居中对齐
  • 构造方法:
FlowLayout();
FlowLayout(int align); //对齐方式
FlowLayout(int align, int hgap, int vgap);//对齐方式,横向间距,纵向间距  

  • 例子:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
流式布局
 */
public class Demo03FlowLayout {
    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.CENTER));
//        frame.setLayout(new FlowLayout(FlowLayout.RIGHT));

        //窗口属性设置
        frame.setBounds(200, 200, 400, 400);

        //将按钮作为组件添加到窗口
        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);
            }
        });
    }
}
  • 结果演示:
    在这里插入图片描述
  1. BorderLayout(分区布局管理器 / 东西南北中):
    • 分区布局管理器将整个容器划分为东、西、南、北、中五个区域,组件只能添加到指定的区域中;
    • 如果不指定区域,默认将添加到center区域;
    • 一个区域只能添加一个组件,如果往一个区域中添加多个组件,则先前添加的组件将会被遗弃;
    • 如果确实想在一个区域中添加多个组件,则可以将组件添加到一个容器中,然后把该容器添加到该区域;
    • 组件的尺寸被容器强行控制,与其所在的区域的尺寸相同;
    • 当容器的尺寸发生变化时,BorderLayout各个区域的尺寸也会发生变化,原则为:
      • 北、南只能水平方向缩放;
      • 东、西只能在垂直方向缩放;
      • 中间区域在水平、垂直方向都可以缩放;
  • BorderLayout中区域相关的常量:
BorderLayout.NORTH  北
BorderLayout.SOUTH  南
BorderLayout.EAST   东
BorderLayout.WEST   西
BorderLayout.CENTER 中
  • 例子:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;

/*
东西南北中布局
 */
public class Demo04BorderLayout {
    public static void main(String[] args) {
        //创建窗口对象
        Frame frame = new Frame("东西南北中布局");

        //组件--按钮
        Button east = new Button("EAST");
        Button west = new Button("WEST");
        Button north = new Button("NORTH");
        Button south = new Button("SOUTH");
        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.setBounds(200, 200, 400, 400);
        frame.setBackground(Color.PINK);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
  • 结果演示:
    在这里插入图片描述
  1. GridLayout(网格布局):
    • 网格布局将容器分为规则的M*N个巨型区域,每个区域大小相等;
    • 组件加入到每个矩形的单元格中,按其加入顺序从左到右填满一行后换行;
    • 组件的大小被网格布局强行控制,受单元格大小的限制;
    • 当容器的尺寸发生 变化时,组件的相对位置保持不变,但大小随容器自动变化;
    • 当组件个数超过网格个数时,布局管理器自动增加网格个数,原则是保持行数不变;
  • GridLayout构造方法:
GridLayout(int m, int n);  //网格的行数、列数
GridLayout(int m, int n, int hgap, int vgap);  //网格的行数、列数、横向间距、纵向间距
  • 例子:
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
网格布局
 */
public class Demo05GridLayout {
    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");
        Button button4 = new Button("button4");
        Button button5 = new Button("button5");
        Button button6 = new Button("button6");

        //设置布局格式
        frame.setLayout(new GridLayout(2, 3, 10, 10));

        //添加组件
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.add(button4);
        frame.add(button5);
        frame.add(button6);

        //设置窗口属性
        frame.setBounds(200, 200, 400, 400);
        frame.setBackground(Color.PINK);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }
}

  • 结果演示:
    在这里插入图片描述
  1. 布局管理器练习:

    实现如下布局:
    在这里插入图片描述

    分析:

    1. 1个frame
    2. 4个面板 border
    3. 左:button; 中:面板; 右:button
    package com.sd.day22;
    
    import java.awt.*;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    
    //Panel 可以看成是一个空间,但是不能单独存在
    public class Demo06Ex {
        public static void main(String[] args) {
            //创建一个窗口对象
            Frame frame = new Frame("案例窗口");
            //设置窗口布局
            frame.setLayout(new GridLayout(2, 1));
    
            //创建四个面板
            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("Button"), BorderLayout.EAST);
            panel1.add(new Button("Button"), BorderLayout.WEST);
            panel2.add(new Button("Button"));
            panel2.add(new Button("Button"));
            panel1.add(panel2, BorderLayout.CENTER);
    
            //下:
            panel3.add(new Button("Button"), BorderLayout.EAST);
            panel3.add(new Button("Button"), BorderLayout.WEST);
    
            //中:
            for (int i = 0; i < 4; i++) {
                panel4.add(new Button("Button"));
            }
    
            panel3.add(panel4, BorderLayout.CENTER);
    
            //将panel添加到frame
            frame.add(panel1);
            frame.add(panel3);
    
            //frame属性设置:
            frame.setBounds(200, 200, 400, 400);
            frame.setBackground(Color.PINK);
            frame.setVisible(true);
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
  • 结果演示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nq5J9J7r-1575271035910)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1575257175184.png)]
2.3 事件监听
  • 事件:用户在界面上的某一操作,通常使用各种输入设备,如鼠标、键盘等;
  • 事件源:产生事件的组件,例如在一个按钮上的单击就是事件源;
  • 监听器:包含事件处理器,负责检查事件是发生,若发生则激活事件处理器对其处理;
2.3.1 按钮监听
addActionListener(); //当用户在此按钮上按下或释放鼠标时,发生动作事件;
  1. 单按钮,监听一个事件
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
单按钮,监听一个事件
 */
public class Demo07ButttonActionEvent {
    public static void main(String[] args) {
        //创建窗口对象
        Frame frame = new Frame("按钮监听");

        //创建按钮对象
        Button button = new Button();

        //创建监听事件对象
        MyActionListener myActionListener = new MyActionListener();
        button.addActionListener(myActionListener);

        frame.add(button);
        frame.pack();

        //frame属性设置:
        frame.setBounds(200, 200, 400, 400);
        frame.setBackground(Color.PINK);
        frame.setVisible(true);
        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("按钮监听事件");
    }
}
  • 结果演示:当在白色区域(button)单击后,就会显示出现在正在做的事;
    在这里插入图片描述
  1. 双按钮,监听同一件事;

    getActionCommand() //获得按钮的信息
    
    import java.awt.Button;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.LayoutManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /*
    两个按钮,实现偶同一监听事件
     */
    public class Demo08TwoButtonActionEvent {
        public static void main(String[] args) {
            //创建窗口对象
            Frame frame = new Frame("开始---停止");
            //设置布局
            frame.setLayout(new FlowLayout(FlowLayout.CENTER));
            //创建按钮对象
            Button startButton = new Button("start");
            Button endButton = new Button("end");
            //可以多个按钮只写一个监听类
            endButton.setActionCommand("endButton---stop");
    
            //创建监视对象
            MyMonitor myMonitor = new MyMonitor();
            startButton.addActionListener(myMonitor);
            endButton.addActionListener(myMonitor);
    
            //添加按钮
            frame.add(startButton);
            frame.add(endButton);
    
            //frame属性设置:
            frame.setBounds(200, 200, 400, 400);
            frame.setBackground(Color.PINK);
            frame.setVisible(true);
            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());
            if (e.getActionCommand().equals("start")) {
    
            }
        }
    }
    
  • 结果演示:
    在这里插入图片描述
2.3.2 输入框TextField监听
import java.awt.Color;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
监听文本框输入:
 */
public class Demo09Text {
    public static void main(String[] args) {
        //启动
        new MyFrame();
    }
}

class MyFrame extends Frame {
    public MyFrame() {
        //创建文本框对象
        TextField textField = new TextField();
        //将之加入frame
        add(textField);

        //监听这个文本框输入的文字
        MyActionListener1 myActionListener1 = new MyActionListener1();
        //按下enter就会触发这个输入框的事件
        textField.addActionListener(myActionListener1);
        //设置替换编码
        textField.setEchoChar('*');
        //frame属性设置:
        setBounds(200, 200, 400, 400);
        setBackground(Color.PINK);
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//监听事件
class MyActionListener1 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //获得资源,返回对象
        TextField textField = (TextField) e.getSource();
        //获得输入框的文本;
        System.out.println(textField.getText());
        textField.setText("");
    }
}
  • 结果演示:

    • 输入文本:你好,Java
      在这里插入图片描述
    • 按下回车:
      在这里插入图片描述
2.3.3简易计算器
  • 功能:实现简单的加法运算:

  • 代码

    1. 基础实现:
    import java.awt.Button;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Label;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /*
    简易计算器
     */
    public class Demo11Calc01 {
            public static void main(String[] args) {
                new Calculator();
            }
        }
    //计算器类
    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 MyCalculatorListener2(num1,num2,num3));
    
            //1 个标签
            Label label = new Label("+");
    
            //布局
            setLayout(new FlowLayout());
    
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
    
            //frame属性设置:
            setBounds(200, 200, 400, 400);
            setBackground(Color.PINK);
            setVisible(true);
            pack();
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    }
    
    //监听器类
    class MyCalculatorListener2 implements ActionListener {
        //获取三个变量
        private TextField num1,num2,num3;
        public MyCalculatorListener2(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));
        }
    }
    
  • 结果演示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-adc9F4Nf-1575271035919)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1575261874089.png)]

  1. 改造为面向对象:
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

//简易计算器
public class Demo12Calc02 {
    public static void main(String[] args) {
        new Calculator().loadFrame();
    }
}

//计算器类
class Calculator extends Frame {

    //属性
    TextField num1, num2, num3;

    //方法
    public void loadFrame() {

        num1 = new TextField(10);//字符数
        num2 = new TextField(10);//字符数
        num3 = new TextField(20);//字符数
        Button button = new Button("=");
        Label label = new Label("+");

        button.addActionListener(new MyCalculatorListener(this));

        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        //frame属性设置:
        setBounds(200, 200, 400, 400);
        setBackground(Color.PINK);
        setVisible(true);
        pack();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

//监听器类
class MyCalculatorListener implements ActionListener {

    //获取计算器这个对象,在一个类中组合另外一个类;
    Calculator calculator = null;
    public MyCalculatorListener(Calculator calculator) {
        this.calculator = calculator;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //1. 获得加数和被加数
        int n = Integer.parseInt(calculator.num1.getText());
        //2. 将这个值 + 法运算后,放到第三个框
        int m = Integer.parseInt(calculator.num2.getText());
        calculator.num3.setText("" + (n + m));
    }
}
  • 结果演示:
    在这里插入图片描述
  1. 内部类,更好的包装:
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
简易计算器
 */
public class Demo10Calc {
    public static void main(String[] args) {
        //启动
        new Calculator().loadFrame();
    }
}

//计算器类:
class Calculator extends Frame {
    //属性:
    TextField num1, num2, num3;

    //方法:
    public void loadFrame() {
        num1 = new TextField(10);//字符数
        num2 = new TextField(10);//字符数
        num3 = new TextField(20);//字符数
        Button button = new Button("=");
        Label label = new Label("+");

        button.addActionListener(new MyCalculatorListener());

        //设置布局
        setLayout(new FlowLayout());

        //添加组件
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        //frame属性设置:
        setBounds(200, 200, 400, 400);
        setBackground(Color.PINK);
        setVisible(true);
        pack();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }

    //监听事件
    //设置为内部类的好处就是可以畅通无阻的访问外部的属性和方法
    private class MyCalculatorListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            int n = Integer.parseInt(num1.getText());
            int m = Integer.parseInt(num2.getText());
            //将值进行加法运算后,放入第三个框
            num3.setText("" + (n + m));
        }
    }
}
  • 结果演示:
    在这里插入图片描述
2.3.4 画笔
package com.sd.day22;


import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/*
画笔
 */
public class Demo13Paint {
    public static void main(String[] args) {
        new MyPanit().loadFrame();
    }

    private static class MyPanit extends Frame {
        public void loadFrame() {
            //设置窗口属性
            setBounds(200, 200, 400, 400);
            setVisible(true);
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            
        }

        @Override
        public void paint(Graphics g) {
            //绘制实体矩形
            g.fillRect(100, 100, 200, 200);
        }
    }
}
  • 结果演示:
    在这里插入图片描述
2.3.5 鼠标监听
  • 当点击鼠标按钮时,有三个监听器方法可以调用:

    public void mousePressed(MouseEvent e); //鼠标按下时调用;
    public void mouseReleased(MouseEvent e) //鼠标被释放时调用;
    public void mouseClicked(MouseEvent e) //鼠标点击时调用
    
  • 以上三个方法均继承MouseListener接口;但是其中有很多不需要的方法,实现时就很麻烦,但是MouseAdapter类实现了MouseListener接口中的所有方法,我们可以直接继承该类并重写我们需要的方法就可以;

  • 目的:实现鼠标画画;
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXh9Ui4m-1575271035928)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1575267828588.png)]

  • 代码

    import java.awt.Color;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Demo4MouseListener {
        public static void main(String[] args) {
            new MyFrameDemo("画图");
        }
    }
    
    /*
    画画的类:
        需要:
            1.画笔;
            2.监听鼠标当前位置;
            3.集合来存储当前位置的点;
     */
    class MyFrameDemo extends Frame {
        //ArrayList集合存储点
        ArrayList points;
    
        public MyFrameDemo(String title) {
            super(title);
            setBounds(200, 200, 400, 400);
            //存鼠标点击的点
            points = new ArrayList();
            //可视化
            setVisible(true);
            addWindowFocusListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            //鼠标监听器,正对这个窗口
            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.PINK);
                g.fillRect(point.x, point.y, 10, 10);
            }
        }
    
        //添加一个点到界面上
        public void addPaint(Point point) {
            points.add(point);
        }
    
        //鼠标按下时调用;
        private class MyMouseListener extends MouseAdapter {
            @Override
            public void mousePressed(MouseEvent e) {
                MyFrameDemo frameDemo = (MyFrameDemo) e.getSource();
                //此点为鼠标点击的点,点击的时候,就会在界面上产生一个点
                frameDemo.addPaint(new Point(e.getX(), e.getY()));
    
                //每次鼠标点击都需要重新画一遍
                frameDemo.repaint();//刷新
            }
        }
    }
    
  • 结果演示:
    在这里插入图片描述

2.3.6 窗口监听
  • 窗口监听事件:WindowListener

    windowOpened      	//打开
    windowActivated   	//激活(获得焦点状态)
    windowDeactivated 	//非激活(失去焦点状态)
    windowIconified   	//最小化
    windowDeiconified 	//最小化恢复正常
    windowClosing     	//关闭(右上角X),优先于windowClosed
    windowClosed      	//关闭,DISPOSE_ON_CLOSE时才会被调用
    
  • 代码:

  • 演示结果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HTqKSh5V-1575271035930)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1575270944622.png)]在这里插入图片描述

2.3.7 键盘监听
  • 当按下、释放时,有以下监听器方法可以调用:

    public void keyPressed(KeyEvent e); //按下某键时调用;
    public void keyReleased(KeyEvent e) //释放某键时调用;
    
  • 以上方法均继承KeyListener接口;但是其中有很多不需要的方法,实现时就很麻烦,但是KeyAdapter类实现了KeyListener接口中的所有方法,我们可以直接继承该类并重写我们需要的方法就可以;

  • 代码:

    import java.awt.Frame;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    /*
    键盘监听
     */
    public class Demo15KeyListener {
        public static void main(String[] args) {
            new KeyFrame();
        }
    }
    //键盘监听类
    class KeyFrame extends Frame {
        public KeyFrame(){
            setBounds(200,200,400,400);
            setVisible(true);
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            this.addKeyListener(new KeyAdapter() {
               //键盘按下
                @Override
                public void keyPressed(KeyEvent e) {
                    //获得键盘下的键是哪一个
                    int keyCode = e.getKeyCode();
    
                    if(keyCode==KeyEvent.VK_DOWN){
                        System.out.println("你按下了上键!");
                    }
                }
            });
        }
    }
    
  • 结果演示:当按下“↓”键的时候,控制台输出“你按下了下键”
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值