生活中,监听无处不在。比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐。即触发某种行为,便执行相应的动作。
Java事件监听器是由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类。JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类。
在事件处理的过程中,主要涉及三类对象。 - Event(事件):用户对组件的一次操作称为一个事件,以类的形式出现。例如,键盘操作对应的事件类是 KeyEvent。 - Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮 Button。 - Event Handler(事件处理者):接收事件对象并对其进行处理的对象事件处理器,通常就是某个 Java 类中负责处理事件的成员方法。
事件处理模型如下图所示:

例如:我们在JFrame窗口里放置一个按钮(Button),鼠标点击按钮弹出一个警告窗口,效果图如下:

通过分析得知:按钮对象就是事件源(Event Source)、鼠标点击产生一个单击事件(Event),按钮上注册有一个事件监听器(Event Handler)去处理这个单击事件弹出一个警告窗口.
java实现事件监听器五种方式: 1)外部类 2)内部类 3)匿名内部类 4)Lambda表达式 5)自己实现ActionListener接口
1.使用外部类
class MyClickListner implements ActionListener {
//以下就是事件处理程序
@Override
public void actionPerformed(ActionEvent e) {
//弹出一个警告窗口
JOptionPane.showMessageDialog(null,"点你妹啊!","提示信息",JOptionPane.YES_OPTION);
}
}
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton bt = new JButton("点我");
panel.setLayout(new FlowLayout()); //设为流布局管理器
panel.add(bt); //把按钮放到面板里面
frame.setTitle("我是窗口的标题"); //设置窗口的标题
frame.setSize(600,400); //设置窗口的大小尺寸
frame.setLocationRelativeTo(null); //窗口出现在屏幕中央。
frame.add(panel); //把面板添加到窗口
bt.addActionListener(new MyClickListner());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认的关闭行为
frame.setVisible(true); //窗口可以显示
}
}
2.内部类实现
public class Test {
static class MyClickListner implements ActionListener{
//以下就是事件处理程序
@Override
public void actionPerformed(ActionEvent e) {
//弹出一个警告窗口
JOptionPane.showMessageDialog(null,"点你妹啊!","提示信息",JOptionPane.YES_OPTION);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton bt = new JButton("点我");
panel.setLayout(new FlowLayout()); //设为流布局管理器
panel.add(bt); //把按钮放到面板里面
frame.setTitle("我是窗口的标题"); //设置窗口的标题
frame.setSize(600,400); //设置窗口的大小尺寸
frame.setLocationRelativeTo(null); //窗口出现在屏幕中央。
frame.add(panel); //把面板添加到窗口
bt.addActionListener(new Test.MyClickListner());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认的关闭行为
frame.setVisible(true); //窗口可以显示
}
}
3.匿名的内部类
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton bt = new JButton("点我");
panel.setLayout(new FlowLayout()); //设为流布局管理器
panel.add(bt); //把按钮放到面板里面
frame.setTitle("我是窗口的标题"); //设置窗口的标题
frame.setSize(600,400); //设置窗口的大小尺寸
frame.setLocationRelativeTo(null); //窗口出现在屏幕中央。
frame.add(panel); //把面板添加到窗口
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null,"点你妹啊!","提示信 息",JOptionPane.YES_OPTION);
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认的关闭行为
frame.setVisible(true); //窗口可以显示
}
}
4.使用Lambda表达式
因为ActionListener是函数式接口,可以使用Lambda表达式实现。
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton bt = new JButton("点我");
panel.setLayout(new FlowLayout()); //设为流布局管理器
panel.add(bt); //把按钮放到面板里面
frame.setTitle("我是窗口的标题"); //设置窗口的标题
frame.setSize(600,400); //设置窗口的大小尺寸
frame.setLocationRelativeTo(null); //窗口出现在屏幕中央。
frame.add(panel); //把面板添加到窗口
bt.addActionListener((e)->JOptionPane.showMessageDialog(null,"点你妹啊!","提示信息",JOptionPane.YES_OPTION));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认的关闭行为
frame.setVisible(true); //窗口可以显示
}
}
5.JFrame窗口自己实现ActionListener接口
public class Test implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//弹出一个警告窗口
JOptionPane.showMessageDialog(null,"点你妹啊!","提示信息",JOptionPane.YES_OPTION);
}
public void showFrame(){
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton bt = new JButton("点我");
panel.setLayout(new FlowLayout()); //设为流布局管理器
panel.add(bt); //把按钮放到面板里面
frame.setTitle("我是窗口的标题"); //设置窗口的标题
frame.setSize(600,400); //设置窗口的大小尺寸
frame.setLocationRelativeTo(null); //窗口出现在屏幕中央。
frame.add(panel); //把面板添加到窗口
bt.addActionListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认的关闭行为
frame.setVisible(true); //窗口可以显示
}
public static void main(String[] args) {
new Test().showFrame();
}
}