当前位置: 代码迷 >> 综合 >> JavaGUI 05 事件监听解决中文乱码
  详细解决方案

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

热度:26   发布时间:2023-11-24 14:02:16.0

3.1 事件监听


3.1.1 理解与学习

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

  • 关闭窗体(事件监听)

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

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

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


上述创建对象和待监听事件(写方法)的形式 是 :匿名内部类。(这种 方式我们不建议写,但不能不知道和不会这样写。我们通过 推荐 开发者写一个 子类 implements 侦听的接口,然后用这个 子类 去创建 侦听器对象!
在这里插入图片描述

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

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

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

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{
    @Overridepublic void actionPerformed(ActionEvent e) {
    System.out.println("按钮已被点击!");}
}

在这里插入图片描述
该事件 被触发。但却存在着 中文乱码问题!!!


3.1.2 AWT窗体中文乱码的解决

  1. Setting --> Build… --> Comiler --> Shared build process VM options
    在这里插入图片描述
  2. 搜索 File Encodings 将其全部设定为 UTF-8
    在这里插入图片描述

但是最后 我还是没有发现编码 正常! 证明 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 {
    @Overridepublic void actionPerformed(ActionEvent e) {
    if(e.getActionCommand() == "Stop"){
    System.out.println("停止按钮被点击!");}else{
    System.out.println("开始按钮被点击!");}}
}

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

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