当前位置:网站首页>Swing有几种常用的事件处理方式?如何监听事件?
Swing有几种常用的事件处理方式?如何监听事件?
2022-08-05 03:26:00 【是一只萨摩耶】
在Swing中,提供了丰富的事件,这些事件大致可以分为窗体事件(WindowEvent)、鼠标事件(MouseEvent)、键盘事件(KeyEvent)、动作事件(ActionEvent)等。接下来,本节中将对这些常用事件进行详细地讲解。
1.窗体事件
大部分GUI应用程序都需要使用Window窗体对象作为最外层的容器,可以说窗体对象是所有GUI应用程序的基础,应用程序中通常都是将其他组件直接或者间接地添加到窗体中。
当对窗体进行操作时,例如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件,Java中提供了一个WindowEvent类用于表示窗体事件。在应用程序中,当对窗体事件进行处理时,首先需要定义一个实现了WindowListener接口的类作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。
接下来通过一个案例来实现对窗体事件的监听,如文件1所示。
文件1 Example07.java
import java.awt.event.*;
import javax.swing.*;
public class Example07 {
private static void createAndShowGUI() {
JFrame f = new JFrame("WindowEvent");
f.setSize(400, 300);
f.setLocation(300, 200);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 使用内部类创建WindowListener实例对象,监听窗体事件
f.addWindowListener(new WindowListener() {
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened---窗体打开事件");
}
public void windowIconified(WindowEvent e) {
System.out.println("windowIconified---窗体图标化事件");
}
public void windowDeiconified(WindowEvent e) {
System.out.println("windowDeiconified---窗体取消图标化事件");
}
public void windowDeactivated(WindowEvent e) {
System.out.println("windowDeactivated---窗体停用事件");
}
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing---窗体正在关闭事件");
}
public void windowClosed(WindowEvent e) {
System.out.println("windowClosed---窗体关闭事件");
}
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated---窗体激活事件");
}
});
}
public static void main(String[] args) {
// 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
SwingUtilities.invokeLater(Example07::createAndShowGUI);
}
}
运行结果如图所示。
文件1中,通过WindowListener对操作窗口的窗体事件进行监听,当接收到特定的动作后,就将所触发事件的名称打印出来。接着对图8-11所示的窗体事件源进行事件操作,分别执行最小化、单击任务栏图标、单击关闭按钮时,窗口事件监听器就会对相应的操作进行监听并响应,结果如下图所示。
2.鼠标事件
在图形用户界面中,用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,其中包括鼠标按下、鼠标松开、鼠标单击等。Java中提供了一个MouseEvent类用于表示鼠标事件,几乎所有的组件都可以产生鼠标事件。处理鼠标事件时,首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类来实现),然后调用addMouseListener()方法将监听器绑定到事件源对象。
接下来通过一个案例来学习如何监听鼠标事件,如文件2所示。
文件2 Example08.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example08 {
private static void createAndShowGUI() {
JFrame f = new JFrame("MouseEvent");
f.setLayout(new FlowLayout()); // 为窗口设置布局
f.setSize(300, 200);
f.setLocation(300, 200);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton but = new JButton("Button");// 创建按钮对象
f.add(but); // 在窗口添加按钮组件
// 为按钮添加鼠标事件监听器
but.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent e) {
System.out.println("mouseReleased-鼠标放开事件");
}
public void mousePressed(MouseEvent e) {
System.out.println("mousePressed-鼠标按下事件");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouseExited—鼠标移出按钮区域事件");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouseEntered—鼠标进入按钮区域事件");
}
public void mouseClicked(MouseEvent e) {
System.out.println("mouseClicked-鼠标完成单击事件");
}
});
}
public static void main(String[] args) {
// 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
SwingUtilities.invokeLater(Example08::createAndShowGUI);
}
}
运行结果如图所示。
在上图中,用鼠标对窗口上的按钮进行操作,先把鼠标移进按钮区域,接着单击按钮然后释放,再移出按钮区域,控制台的输出信息如下图所示。
从图可以看出,当鼠标对按钮作出了相应的动作之后,监听器获取到相应的事件对象,从而打印出动作所对应的事件名称。
读者可能会问,鼠标的操作分为左键单双击和右键单双击,而且还有滚轮动作。上面只给出这些事件的处理,能满足实际需求吗?答案是肯定的,MouseEvent类中定义了很多常量来识别鼠标动作。如下面的代码所示:
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON1){
System.out.println("鼠标左击事件");
}
if(e.getButton()==MouseEvent.BUTTON3){
System.out.println("鼠标右击事件");
}
if(e.getButton()==MouseEvent.BUTTON2){
System.out.println("鼠标中键单击事件");
}
}
从上面的代码可以看出,MouseEvent类中针对鼠标的按键都定义了对应的常量,可以通过MouseEvent对象的getButton()方法获取被操作按键的键值,从而判断是哪个按键的操作。另外,鼠标的单击次数也可以通过MouseEvent对象的getClickCount()方法获取到。因此,在鼠标事件中,可以根据不同的操作,做出相应的处理。
3.键盘事件
键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件。Java中提供了一个KeyEvent类表示键盘事件,处理KeyEvent事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类,然后调用addKeyListener()方法将监听器绑定到事件源对象。
接下来通过一个案例来学习如何监听键盘事件,如文件3所示。
文件3 Example09.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example09 {
private static void createAndShowGUI() {
JFrame f = new JFrame("KeyEvent");
f.setLayout(new FlowLayout());
f.setSize(400, 300);
f.setLocation(300, 200);
JTextField tf = new JTextField(30); // 创建文本框对象
f.add(tf); // 在窗口中添加文本框组件
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 为文本框添加键盘事件监听器
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
// 获取对应的键盘字符
char keyChar = e.getKeyChar();
// 获取对应的键盘字符代码
int keyCode = e.getKeyCode();
System.out.print("键盘按下的字符内容为:" + keyChar+" ");
System.out.println("键盘按下的字符代码为:" + keyCode);
}
});
}
public static void main(String[] args) {
// 使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序
SwingUtilities.invokeLater(Example09::createAndShowGUI);
}
}
运行结果如下:
文件3中,用到JTextComponent类的子类JTextField,它只允许编辑单行文本。当在图中的文件框中键入字符时,便触发了键盘事件,会执行重写的keyPressed()方法。这时,可以通过KeyEvent类的getKeyChar()方法获取键盘键入的字符,通过getKeyCode()方法可以获取输入字符对应的整数值。在上图所示的窗口中,依次输入键盘上的a、s、1字符时,控制台将按键对应的名称和键值(keyCode)打印了出来,如下图所示。
4.动作事件
动作事件与前面三种事件有所不同,它不代表某类事件,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。在这里读者不需要关心使用哪种方式对文件进行关闭,只要是对关闭按钮进行操作,即触发了动作事件。
在Java中,动作事件用ActionEvent类表示,处理ActionEvent事件的监听器对象需要实现ActionListener接口。监听器对象在监听动作时,不会像鼠标事件一样处理鼠标的移动和单击的细节,而是去处理类似于“按钮按下”这样“有意义”的事件。
Java基础入门:
java零基础自学首Java入门教程(含Java项目和Java真题)
Javaweb核心基础
JavaWeb基础教程,Java web从入门到企业实战完整版
Spring Cloud最全微服务架构:
Spring全套教程,入门到精通
SSM框架教程:
SSM框架教程_Spring+SpringMVC+Maven高级+Spring
SpringBoot2全套视频教程:
边栏推荐
- 思考(八十八):使用 protobuf 自定义选项,做数据多版本管理
- Solve the problem of port occupancy Port xxxx was already in use
- How to find all fields with empty data in sql
- XMjs cross-domain problem solving
- QT: The Magical QVarient
- Burp installation and proxy settings
- 冰蝎V4.0攻击来袭,安全狗产品可全面检测
- presto启动成功后出现2022-08-04T17:50:58.296+0800 ERROR Announcer-3 io.airlift.discovery.client.Announcer
- sql怎么找字段里所有数据为空的字段
- Summary of domestic environments supported by SuperMap
猜你喜欢
Dive into how it works together by simulating Vite
presto启动成功后出现2022-08-04T17:50:58.296+0800 ERROR Announcer-3 io.airlift.discovery.client.Announcer
A small tool to transfer files using QR code - QFileTrans 1.2.0.1
告白数字化转型时代,时速云镌刻价值新起点
【滤波跟踪】基于matlab无迹卡尔曼滤波惯性导航+DVL组合导航【含Matlab源码 2019期】
Principle and Technology of Virtual Memory
Detailed and comprehensive postman interface testing practical tutorial
结构体初解
Initial solution of the structure
YYGH-13-Customer Service Center
随机推荐
In 2022, you still can't "low code"?Data science can also play with Low-Code!
Fifteen. Actual combat - MySQL database building table character set and collation
Dive into how it works together by simulating Vite
Solana NFT开发指南
Android实战开发-Kotlin教程(入门篇-登录功能实现 3.3)
Kubernetes 网络入门
如何在WordPress中添加特定类别的小工具
调用阿里云oss和sms服务
This year's Qixi Festival, "love vegetables" are more loving than gifts
Defect detection (image processing part)
You may use special comments to disable some warnings. Three ways to report errors
The sword refers to Offer--find the repeated numbers in the array (three solutions)
ASP.NET应用程序--Hello World
2022高处安装、维护、拆除考试题模拟考试题库及在线模拟考试
AI + Small Nucleic Acid Drugs | Eleven Completes $22 Million Seed Round Financing
public static
List asList(T... a) What is the prototype? Dynamic management of massive service instances
[Filter tracking] based on matlab unscented Kalman filter inertial navigation + DVL combined navigation [including Matlab source code 2019]
21 Days Learning Challenge (2) Use of Graphical Device Trees
[Storage] Dawning Storage DS800-G35 ISCSI maps each LUN to the server