Swing图形用户界面编程之事件处理模式
Posted <一蓑烟雨任平生>
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 :caizhengjie888@icloud.com
* @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 :caizhengjie888@icloud.com
* @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:窗口适配器。
以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!
以上是关于Swing图形用户界面编程之事件处理模式的主要内容,如果未能解决你的问题,请参考以下文章