Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 385|回复: 0

[Swing学习]Java Swing中事件的三种处理方法

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-8 23:56:50 | 显示全部楼层 |阅读模式
    Swing是目前java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的强大工具。Java Swing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时,Swing组件会产生一个ActionEvent。Swing组件会产生许多事件,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户的鼠标点击行为,列表框中值的改变,计时器的开始计时等行为。在Java Swing编程中,通过注册监听器,我们可以监听事件源产生的事件,从而在事件处理程序中处理我们所需要处理的用户行为。

    Java Swing中处理各组件事件的一般步骤是:
    1. 新建一个组件(如JButton)。

    2. 将该组件添加到相应的面板(如JPanel)。

    3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。

    4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
      
       
       
         
       

         
       
      
         以上步骤我们可以用多种方法实现。但人们通常用二种方法。
    第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;

    第二种方法是使用多个内部类来响应不同组件产生的各种事件,其具体实现又分两种方式,一种是匿名内部类,一种是一般内部类。

    为了说明如何使用上述三种方法实现事件的处理方法,我们建立一个简单的应用程序。该程序界面有两个按钮,当用户点击相应的按钮,就会弹出一个对话框显示相应的内容。通过这个简单程序,你可以实现自己更多、更复杂的用户界面程序。 首先,我们利用单个监听器来实现该程序。我们定义一个名为Simple1的类来包括所有代码。所有的用户行为(如点击按钮)由一个监听器 SimpleListenner中的actionPerformed方法来处理。 以下是代码:

    1.     /*
    2.     * Simple1.java - 处理事件的第一种方法
    3.     * 在这个例子中,利用一个ActionListener来监听事件源产生的事件
    4.     * 用一些if语句来决定是哪个事件源
    5.     */
    6.     import java.awt.*;
    7.     import java.awt.event.*;
    8.     import javax.swing.*;
    9.     public class Simple1
    10.     {
    11.     private static JFrame frame; // 定义为静态变量以便main使用
    12.     private static JPanel myPanel; // 该面板用来放置按钮组件
    13.     private JButton button1;    // 这里定义按钮组件
    14.     private JButton button2;    // 以便让ActionListener使用
    15.     public Simple1()             // 构造器, 建立图形界面
    16.     {
    17.            // 新建面板
    18.            myPanel = new JPanel();
    19.            // 新建按钮
    20.            button1 = new JButton("按钮1");   // 新建按钮1
    21.            button2 = new JButton("按钮2");
    22.            SimpleListener ourListener = new SimpleListener();
    23.     // 建立一个actionlistener让两个按钮共享
    24.            button1.addActionListener(ourListener);
    25.            button2.addActionListener(ourListener);
    26.            myPanel.add(button1); // 添加按钮到面板
    27.            myPanel.add(button2);
    28.     }
    29.     private class SimpleListener implements ActionListener
    30.     {
    31.     /*
    32.         * 利用该内部类来监听所有事件源产生的事件
    33.         * 便于处理事件代码模块化
    34.         */
    35.            public void actionPerformed(ActionEvent e)
    36.            {
    37.              // 利用getActionCommand获得按钮名称
    38.              // 也可以利用getSource()来实现
    39.              // if (e.getSource() ==button1)
    40.              String buttonName = e.getActionCommand();
    41.              if (buttonName.equals("按钮1")
    42.                 JOptionPane.showMessageDialog(frame,
    43.                                                "按钮1 被点击";
    44.              else if (buttonName.equals("按钮2")
    45.                 JOptionPane.showMessageDialog(frame,
    46.                                                "按钮2 被点击");
    47.              else
    48.                 JOptionPane.showMessageDialog(frame,
    49.                                                "Unknown event" );
    50.            }
    51.     }
    52.     public static void main(String s[])
    53.     {
    54.            Simple1 gui = new Simple1(); // 新建Simple1组件
    55.            frame = new JFrame("Simple1");   // 新建JFrame
    56.            // 处理关闭事件的通常方法
    57.            frame.addWindowListener(new WindowAdapter() {
    58.              public void windowClosing(WindowEvent e)
    59.                  {System.exit(0);} });
    60.            frame.getContentPane().add(myPanel);
    61.            frame.pack();               
    62.            frame.setVisible(true);
    63.            }
    64.     }
    复制代码
    让我们来看看以上代码是如何工作的。在main方法中,我们定义了一个JFrame,然后将面板Jpanel添加到窗体中,该面板包括两个按钮。相应的变量Frame,button1,button2定义在程序的开头部分。 在程序入口main方法中,首先新建Simple1组件,通过构造器建立用户GUI,定义一个面板Jpanle,,增加两个按钮,然后利用 JButton.addActionListerner将两个按钮加入到一个活动监听器SimpleLister中,最后,两个按钮添加到面板。当GUI 建立后,我们将面板添加到窗体并显示结果。当用户点击按钮时,程序调用actionPerformed方法,通过if语句来判断是哪一个按钮被点击,然后在对话框中显示相应的内容。 利用一个监听器来处理事件的缺点是,当程序比较复杂时,需要一大串的if 语句来实现,程序代码较难阅读与维护。当然,如果处理的事件较少,这种方式比较简单。 通过使用匿名内部类可以解决上述存在的问题。使用简单的匿名内部类作为addActionListener的变量即可。 以下是实现代码:

    1.     /*
    2.     * Simple2.java - 处理事件的第二种方法
    3.     * 在这个例子中,利用匿名内部类来监听每一个事件源产生的事件
    4.     * 避免使用一些if语句来决定是哪个事件源
    5.     */
    6.     import java.awt.*;
    7.     import java.awt.event.*;
    8.     import javax.swing.*;
    9.     public class Simple2
    10.     {
    11.     private static JFrame frame; // 定义为静态变量以便main使用
    12.     private static JPanel myPanel; // 该面板用来放置按钮组件
    13.     private JButton button1;    // 这里定义按钮组件
    14.     private JButton button2;    // 以便让ActionListener使用
    15.     public Simple2()             // 构造器, 建立图形界面
    16.         {
    17.            // 新建面板
    18.            myPanel = new JPanel();
    19.            // 新建按钮
    20.            button1 = new JButton("按钮1");   // 新建按钮1
    21.            button2 = new JButton("按钮2");
    22.            // 每一个事件源需要一个监听器
    23.            // 定义一个匿名内部类来监听事件源产生的事件
    24.            button1.addActionListener(
    25.              new ActionListener()
    26.              {
    27.                 public void actionPerformed(ActionEvent e)
    28.                 {
    29.                        JOptionPane.showMessageDialog(frame,
    30.                                            "按钮1 被点击");
    31.                 }
    32.              }
    33.            );
    34.            button2.addActionListener(
    35.              new ActionListener()
    36.              {
    37.                 public void actionPerformed(ActionEvent e)
    38.                 {
    39.                        JOptionPane.showMessageDialog(frame,
    40.                                                "按钮2 被点击");
    41.                 }
    42.              }
    43.            );
    44.            myPanel.add(button1);        // 添加按钮到面板
    45.            myPanel.add(button2);
    46.     }
    47.     public static void main(String s[])
    48.     {
    49.            Simple2 gui = new Simple2(); // 新建Simple2组件
    50.            frame = new JFrame("Simple2");   // 新建JFrame
    51.            // 处理关闭事件的通常方法
    52.            frame.addWindowListener(new WindowAdapter() {
    53.              public void windowClosing(WindowEvent e)
    54.                  {System.exit(0);} });
    55.            frame.getContentPane().add(myPanel);
    56.            frame.pack();               
    57.            frame.setVisible(true);
    58.            }
    59.     }
    复制代码
    使用匿名内部类同样存在许多另外的问题。首先,根据组件在代码中被定义的不同位置,类的定义以及处理事件的代码将分散在程序的各个部分,不是集中在一块,同样不便于阅读与维护。各事件的处理全部由嵌套的程序块组成,视觉上很难定位程序代码。如果事件处理程序比较复杂,内部类中的代码将变得很长,你将找不到相应的组件定义位置。最后,当工具栏、菜单栏目等需要处理同样的用户行为时,该方法将使代码更难维护。 我们使用一般的命名内部类可以解决以上许多问题。所有的事件处理方法都集中在一块,并且都具有有意义的名称,程序非常容易阅读与维护。单个的事件处理程序也可以被工具栏、菜单栏等重复使用, 以下是实现代码:

    1.     /*
    2.     * Simple3.java - 处理事件的第三种方法
    3.     * For this example, we will use inner member classes to
    4.     * 在这个例子中,利用一般内部类来监听每个事件源产生的事件
    5.     * 该方法避免了第二种方法中由于使用匿名内部类而导致的代码混乱
    6.     * 便于集中处理事件代码
    7.     * 每一个Hander可以被工具栏或菜单多次使用
    8.     */
    9.     import java.awt.*;
    10.     import java.awt.event.*;
    11.     import javax.swing.*;
    12.     public class Simple3
    13.     {
    14.     private static JFrame frame; // 定义为静态变量以便main使用
    15.     private static JPanel myPanel; // 该面板用来放置按钮组件
    16.     private JButton button1;    // 这里定义按钮组件
    17.     private JButton button2;    // 以便让ActionListener使用
    18.     // 利用一般内部类来监听每一个事件源产生的事件如(button1, button2)
    19.     private class Button1Handler implements ActionListener
    20.     {
    21.            public void actionPerformed(ActionEvent e)
    22.            {
    23.              JOptionPane.showMessageDialog(frame,
    24.                                             "按钮1 被点击");
    25.            }
    26.     }
    27.     private class Button2Handler implements ActionListener
    28.     {
    29.            public void actionPerformed(ActionEvent e)
    30.            {
    31.              JOptionPane.showMessageDialog(frame,
    32.                                             "按钮2 被点击");
    33.            }
    34.     }
    35.     public Simple3()             //   // 构造器, 建立图形界面
    36.     {
    37.           // 新建面板
    38.            myPanel = new JPanel();
    39.            // 新建按钮
    40.            button1 = new JButton("按钮1");   // 新建按钮1
    41.            button2 = new JButton("按钮2");
    42.            // 对每一个组件注册监听内部类
    43.            button1.addActionListener(new Button1Handler());
    44.            button2.addActionListener(new Button2Handler());
    45.            myPanel.add(button1);        // 添加按钮到面板
    46.            myPanel.add(button2);
    47.     }
    48.     public static void main(String s[])
    49.     {
    50.            Simple3 gui = new Simple3();   // 新建Simple3组件
    51.            frame = new JFrame("Simple3");   // 新建JFrame
    52.            // 处理关闭事件的通常方法        
    53.            frame.addWindowListener(new WindowAdapter() {
    54.              public void windowClosing(WindowEvent e)
    55.                  {System.exit(0);} });
    56.            frame.getContentPane().add(myPanel);
    57.            frame.pack();               
    58.            frame.setVisible(true);
    59.            }
    60.     }
    复制代码
    以上分析了在Java Swing中三种事件的处理方式,其中利用一般内部类来实现的方法,从代码书写、阅读、维护以及程序的可扩展性角度来看,最为值得推荐供大家使用。



      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:46 , Processed in 0.299025 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表