JavaGUI 05 事件监听&&解决中文乱码

3.1 事件监听


3.1.1 理解与学习

我们会监听当某个事情发生的时候,我们需要干什么。这就是 "事件监听"

  • 关闭窗体(事件监听)

之前我们就写过 关闭窗体的事件监听,它的格式是什么来着?

frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
            }
        });

是通过 我们创建的 frame 这个对象,调用了 一个 添加窗口侦听器(addWindowListener) 这个方法来进行的,这个方法有一个参数就是接收 一个 侦听器对象! 而这个对象,具有很多方法,这些方法,又称为 “事件”


上述创建对象和待监听事件(写方法)的形式 是 :匿名内部类。(这种 方式我们不建议写,但不能不知道和不会这样写。我们通过 推荐 开发者写一个 子类 implements 侦听的接口,然后用这个 子类 去创建 侦听器对象!
JavaGUI 05 事件监听&&解决中文乱码

  • 每个组件和容器 都有事件

每个组件和容器,都是有事件存在的!就连最简单的按钮,都是具有 点击 事件的。而 它们 添加事件的方法 和 关闭窗体的那个大同小异!

比如:按钮点击 事件的格式是

button.addActionListener(按钮的侦听器);

每个组件和容器 的侦听器也可能不一样,这个 侦听器的类型,需要 看 该 组件和容器的 添加事件 方法叫什么名字,通常 它们是非常相似的。

package com.muquanyu.leeson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestActionEvent {
    public static void main(String[] args) {
        //比如按下按钮,触发一些事件

        Frame frame = new Frame();
        Button button = new Button("请点击一下哟 ~");
        MyActionListener m = new MyActionListener();
        button.addActionListener(m);
        frame.add(button);

        frame.setVisible(true);
    }
}

class MyActionListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮已被点击!");
    }
}

JavaGUI 05 事件监听&&解决中文乱码
该事件 被触发。但却存在着 中文乱码问题!!!


3.1.2 AWT窗体中文乱码的解决

  1. Setting --> Build… --> Comiler --> Shared build process VM options
    JavaGUI 05 事件监听&&解决中文乱码
  2. 搜索 File Encodings 将其全部设定为 UTF-8
    JavaGUI 05 事件监听&&解决中文乱码

但是最后 我还是没有发现编码 正常! 证明 AWT 一直对 中文着 不友好的 Bug。


3.1.3 两个按钮同监听

实现 Start 和 Stop 两个按钮的 监听,但只用 一个监听里面的事件 就可以完成!

package com.muquanyu.leeson02;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class StartAndEnd {
    public static void main(String[] args) {
        Frame frame = new Frame();

        Button start = new Button("Start");
        Button stop = new Button("Stop");
        start.setActionCommand("Start");
        stop.setActionCommand("Stop");

        frame.setLayout(new FlowLayout());
        frame.add(start);
        frame.add(stop);

        StartAndStop sas = new StartAndStop();

        start.addActionListener(sas);
        stop.addActionListener(sas);

        frame.setVisible(true);
    }
}
class StartAndStop implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand() == "Stop")
        {
            System.out.println("停止按钮被点击!");
        }else{
            System.out.println("开始按钮被点击!");
        }
    }
}

setActionCommand() 就是在事件被触发后,返回一个 特有的 命令码。(相当于 令牌 Key)来告诉 我们,当前 触发事件的这个组件或容器 是什么!!

那么我们就可以 根据 返回的 Command 来进行一个判断,虽然都是同一个事件,但是每次触发的时候,都会返回 不一样的 Command,也就代表着,不同的按钮,在触发着一个事件!这就叫做 同监听(这种方式 可以 提高效率,不浪费内存。)。

上一篇:JavaGUI三种布局管理器FlowLayout,BorderLayout,GridLayout的使用


下一篇:javaGUI学习41:Swing-边框、图标和动作