Swing图形用户界面编程之事件处理模式


图形界面的组件要响应用户操作,就必须添加事件处理机制。Swing采用AWT的事件处理模型进行事件处理。在事件处理的过程中涉及三个要素:

  • 事件:是用户对界面的操作,例如按钮单击事件
  • 事件源:是事件发生的场所,就是各个组件,例如按钮单击事件的事件源是按钮(Button)
  • 事件处理者:是事件处理程序,在Java中事件处理者是实现特定接口的事件对象。

在事件处理模型中最重要的是事件处理者,它根据事件(假设XXXEvent事件)的不同会实现不同的接 口,这些接口命名为XXXListener,所以事件处理者也称为事件监听器。最后事件源通过 addXXXListener()方法添加事件监听,监听XXXEvent事件。

事件处理者可以是实现了XXXListener接口任何形式,即:外部类、内部类、匿名内部类和Lambda表 达式;如果XXXListener接口只有一个抽象方法,事件处理者还可以是Lambda表达式。为了访问窗口 中的组件方便,往往使用内部类、匿名内部类和Lambda表达式情况很多。
事件类型和事件监听器接口:
在这里插入图片描述

一、采用内部类处理事件

学习事件处理主要是复习之前所学的内部类以及Lambda知识;
事件处理模型示例 示例代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author : 蔡政洁
 * @email :[email protected]
 * @date : 2020/2/23
 * @time : 9:04 上午
 */
public class MyFrame extends JFrame {
//    声明标签
    JLabel label;
    public MyFrame(String title){
        super(title);
//        创建标签
        label = new JLabel("caizhengjie");
//        添加到内容面板
        getContentPane().add(label, BorderLayout.NORTH);

//        创建Button1
        JButton button1 = new JButton("Button1");
//        添加到内容面板
        getContentPane().add(button1,BorderLayout.CENTER);

//        创建Button2
        JButton button2 = new JButton("Button1");
//        添加到内容面板
        getContentPane().add(button2,BorderLayout.SOUTH);

//        设置窗口大小
        setSize(350,120);
//        设置窗口可见
        setVisible(true);

//        注册事件监听器,监听Button2单机事件,这里采用内部类写法
        button2.addActionListener(new ActionEventerHandler());

//        注册事件监听器,监听Button1单机事件,这里采用匿名内部类写法
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("Hello Swing");
            }
        });


    }
//        Button2事件处理者
    class ActionEventerHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText("Hello World!");
        }
    }
}

调用代码:

public class HelloWorld {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("hehehe");
    }
}

运行结果:
在这里插入图片描述

二、采用Lambda表达式处理事件

如果一个事件监听器接口只有一个抽象方法,则可以使用Lambda表达式实现事件处理
展示代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author : 蔡政洁
 * @email :[email protected]
 * @date : 2020/2/23
 * @time : 9:25 上午
 */
public class MyFrame extends JFrame implements ActionListener {
//    声明标签
    JLabel label;
    public MyFrame(String title) {
        super(title);
//        创建标签
        label = new JLabel("caizhengjie");
//        添加到内容面板
        getContentPane().add(label, BorderLayout.NORTH);

//        创建Button1
        JButton button1 = new JButton("Button1");
//        添加到内容面板
        getContentPane().add(button1, BorderLayout.CENTER);

//        创建Button2
        JButton button2 = new JButton("Button1");
//        添加到内容面板
        getContentPane().add(button2, BorderLayout.SOUTH);

//        设置窗口大小
        setSize(350, 120);
//        设置窗口可见
        setVisible(true);

//        注册事件监听器,监听Button2单机事件
        button2.addActionListener(this);

//        注册事件监听器,监听Button1单机事件,这里采用Lambda表达式写法
        button1.addActionListener((envent) ->{
            label.setText("Hello World");
        });

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        label.setText("Hello Swing");
    }
}

调用代码:

public class Helloworld {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("caizhengjie");
    }
}

运行结果和上面一样

三、使用适配器

事件监听器都是接口,在Java中接口中定义的抽象方法必须全部是实现,哪怕你对某些方法并不关 心,你也要给一对空的大括号表示实现。
例如WindowListener是窗口事件(WindowEvent)监听器接 口,为了在窗口中接收到窗口事件,需要在窗口中注册WindowListener事件监听器,示例代码如下:

this.addWindowListener(new WindowListener() {
          @Override
          public void windowActivated(WindowEvent e) {
          }
          @Override
          public void windowClosed(WindowEvent e) {
          }
          @Override
          public void windowClosing(WindowEvent e) {            
// 退出系统
				System.exit(0); }
          @Override
          public void windowDeactivated(WindowEvent e) {
          }
          @Override
          public void windowDeiconified(WindowEvent e) {
          }
          @Override
          public void windowIconified(WindowEvent e) {
          }
          @Override
          public void windowOpened(WindowEvent e) {
          }
});

这样的代码看起来很臃肿,为此Java还提供了一些与监听器相配套的适配器。
监听器是接 口,命名采用XXXListener,而适配器是类,命名采用XXX Adapter。
使用适配器的目的是:在使用时通过继承事件所对应的 适配器类,覆盖所需要的方法,无关方法不用实现,使代码看起来简洁。

采用适配器注册接收窗口事件代码如下:

this.addWindowListener(new WindowAdapter(){ 
@Override
	public void windowClosing(WindowEvent e) { 
	// 退出系统
		System.exit(0);
	}
});

可见代码非常的简洁。事件适配器提供了一种简单的实现监听器的手段,可以缩短程序代码。
并非所有的监听器接口都有对应的适配器类,一般定义了多个方法的监听器接口,例如 WindowListener有多个方法对应多种不同的窗口事件时,才需要配套的适配器,主要的适配器如下:

  • ComponentAdapter:组件适配器。
  • ContainerAdapter:容器适配器。
  • FocusAdapter:焦点适配器。
  • KeyAdapter:键盘适配器。
  • MouseAdapter:鼠标适配器。
  • MouseMotionAdapter:鼠标运动适配器。
  • WindowAdapter:窗口适配器。

以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

发布了69 篇原创文章 · 获赞 7 · 访问量 3312

猜你喜欢

转载自blog.csdn.net/weixin_45366499/article/details/104464176