当前位置:网站首页>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全套视频教程:
边栏推荐
- How to simulate the background API call scene, very detailed!
- High Item 02 Information System Project Management Fundamentals
- Open-Falcon of operation and maintenance monitoring system
- Queue Topic: Recent Requests
- shell脚本:for循环与while循环
- IJCAI2022 | DictBert: Pre-trained Language Models with Contrastive Learning for Dictionary Description Knowledge Augmentation
- Ice Scorpion V4.0 attack, security dog products can be fully detected
- 龙蜥社区第二届理事大会圆满召开!理事换届选举、4 位特约顾问加入
- Detailed and comprehensive postman interface testing practical tutorial
- (11) Metaclass
猜你喜欢
How to Add Category-Specific Widgets in WordPress
2022-08-04 The sixth group, hidden from spring, study notes
token、jwt、oauth2、session解析
Developing Hololens encountered The type or namespace name 'HandMeshVertex' could not be found..
Confessing the era of digital transformation, Speed Cloud engraves a new starting point for value
用CH341A烧录外挂Flash (W25Q16JV)
After the large pixel panorama is completed, what are the promotion methods?
Is your data safe in this hyperconnected world?
Use SuperMap iDesktopX data migration tool to migrate map documents and symbols
Why did they choose to fall in love with AI?
随机推荐
ASP.NET应用程序--Hello World
Hash table lookup (hash table)
This year's Qixi Festival, "love vegetables" are more loving than gifts
惨遭打脸:字节某部门竟有这么多测试员
Fifteen. Actual combat - MySQL database building table character set and collation
On governance and innovation, the 2022 OpenAtom Global Open Source Summit OpenAnolis sub-forum came to a successful conclusion
Web3.0 Dapps - the road to the future financial world
Package zip is not available, but is referred to by another package.
【滤波跟踪】基于matlab无迹卡尔曼滤波惯性导航+DVL组合导航【含Matlab源码 2019期】
ffmpeg 像素格式基础知识
冰蝎V4.0攻击来袭,安全狗产品可全面检测
[论文笔记] MapReduce: Simplified Data Processing on Large Clusters
token、jwt、oauth2、session解析
Cybersecurity and the Metaverse: Identifying Weak Links
基于生长的棋盘格角点检测方法
rpc-remote procedure call demo
21 Days Learning Challenge (2) Use of Graphical Device Trees
In 2022, you still can't "low code"?Data science can also play with Low-Code!
YYGH-13-Customer Service Center
905. 区间选点