• Swing有几种常用的事件处理方式?如何监听事件?


    在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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行结果如图所示。
    在这里插入图片描述

    文件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);
             }
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    运行结果如图所示。
    在这里插入图片描述
    在上图中,用鼠标对窗口上的按钮进行操作,先把鼠标移进按钮区域,接着单击按钮然后释放,再移出按钮区域,控制台的输出信息如下图所示。
    在这里插入图片描述
    从图可以看出,当鼠标对按钮作出了相应的动作之后,监听器获取到相应的事件对象,从而打印出动作所对应的事件名称。

    读者可能会问,鼠标的操作分为左键单双击和右键单双击,而且还有滚轮动作。上面只给出这些事件的处理,能满足实际需求吗?答案是肯定的,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("鼠标中键单击事件");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    从上面的代码可以看出,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);
             }
         }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    运行结果如下:
    在这里插入图片描述
    文件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最全微服务架构

    史上最全面的springcloud微服务技术栈

    Spring全套教程,入门到精通

    Spring视频教程,全面深度讲解spring5底层原理

    SSM框架教程:

    SSM框架教程_Spring+SpringMVC+Maven高级+Spring

    SpringBoot2全套视频教程:

    SpringBoot2全套视频教程,springboot零基础到项目实战

  • 相关阅读:
    【docker】安装clickhouse
    Grafana----配置使用Gitlab账号认证登录Grafana
    java计算机毕业设计springboot+vue专业手语翻译预约系统
    另辟奚径-Android Studio调用Delphi窗体
    LuatOS-SOC接口文档(air780E)--camera - codec - 多媒体-编解码
    【每日一题Day45】LC1769移动所有球到每个盒子所需要的最小操作数 | 模拟 贡献
    Linux下使用openssl为harbor制作证书
    52、GNT:Is Attention All NeRF Needs?
    为什么list.sort()比Stream().sorted()更快?
    Python之父加入微软三年后,Python嵌入Excel!
  • 原文地址:https://blog.csdn.net/Aa112233aA1/article/details/126161272