我们会监听当某个事情发生的时候,我们需要干什么。这就是 "事件监听"
之前我们就写过 关闭窗体的事件监听,它的格式是什么来着?
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("按钮已被点击!"); } }
该事件 被触发。但却存在着 中文乱码问题!!!
- Setting --> Build… --> Comiler --> Shared build process VM options
- 搜索 File Encodings 将其全部设定为 UTF-8
但是最后 我还是没有发现编码 正常! 证明 AWT 一直对 中文着 不友好的 Bug。
实现 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,也就代表着,不同的按钮,在触发着一个事件!这就叫做 同监听(这种方式 可以 提高效率,不浪费内存。)。