3.1 事件监听
3.1.1 理解与学习
我们会监听当某个事情发生的时候,我们需要干什么。这就是 "事件监听"
- 关闭窗体(事件监听)
之前我们就写过 关闭窗体的事件监听,它的格式是什么来着?
frame.addWindowListener(new WindowAdapter() {
@Override
public 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{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮已被点击!");
}
}
该事件 被触发。但却存在着 中文乱码问题!!!
3.1.2 AWT窗体中文乱码的解决
- Setting --> Build… --> Comiler --> Shared build process VM options
- 搜索 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 {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "Stop")
{
System.out.println("停止按钮被点击!");
}else{
System.out.println("开始按钮被点击!");
}
}
}
setActionCommand() 就是在事件被触发后,返回一个 特有的 命令码。(相当于 令牌 Key)来告诉 我们,当前 触发事件的这个组件或容器 是什么!!
那么我们就可以 根据 返回的 Command 来进行一个判断,虽然都是同一个事件,但是每次触发的时候,都会返回 不一样的 Command,也就代表着,不同的按钮,在触发着一个事件!这就叫做 同监听(这种方式 可以 提高效率,不浪费内存。)。