← 返回首页
JavaSE系列教程(六十八)
发表时间:2020-02-16 16:09:51
讲解java的事件监听机制

生活中,监听无处不在。比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐。即触发某种行为,便执行相应的动作。

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();
    }
}