溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java Swing中事件處理方法有哪些

發(fā)布時(shí)間:2021-12-27 17:27:13 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)Java Swing中事件處理方法有哪些,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Swing是目前Java中不可缺少的窗口工具組,是用戶建立圖形化用戶界面(GUI)程序的強(qiáng)大工具。Java Swing組件自動(dòng)產(chǎn)生各種事件來響應(yīng)用戶行為。如當(dāng)用戶點(diǎn)擊按鈕或選擇菜單項(xiàng)目時(shí),Swing組件會(huì)產(chǎn)生一個(gè)ActionEvent。Swing組件會(huì)產(chǎn)生許多事件,如ActionEvents,ChangeEvents,ItemEvents等,來響應(yīng)用戶的鼠標(biāo)點(diǎn)擊行為,列表框中值的改變,計(jì)時(shí)器的開始計(jì)時(shí)等行為。在Java Swing編程中,通過注冊(cè)監(jiān)聽器,我們可以監(jiān)聽事件源產(chǎn)生的事件,從而在事件處理程序中處理我們所需要處理的用戶行為。

Java Swing中處理各組件事件的一般步驟是:

1.  新建一個(gè)組件(如JButton)。

2.  將該組件添加到相應(yīng)的面板(如JPanel)。

3.  注冊(cè)監(jiān)聽器以監(jiān)聽事件源產(chǎn)生的事件(如通過ActionListener來響應(yīng)用戶點(diǎn)擊按鈕)。

4.  定義處理事件的方法(如在ActionListener中的actionPerformed中定義相應(yīng)方法)。

以上步驟我們可以用多種方法實(shí)現(xiàn)。但人們通常用二種方法。第一種方法是只利用一個(gè)監(jiān)聽器以及多個(gè)if語句來決定是哪個(gè)組件產(chǎn)生的事件;第二種方法是使用多個(gè)內(nèi)部類來響應(yīng)不同組件產(chǎn)生的各種事件,其具體實(shí)現(xiàn)又分兩種方式,一種是匿名內(nèi)部類,一種是一般內(nèi)部類。

   為了說明如何使用上述三種方法實(shí)現(xiàn)事件的處理方法,我們建立一個(gè)簡(jiǎn)單的應(yīng)用程序。該程序界面有兩個(gè)按鈕,當(dāng)用戶點(diǎn)擊相應(yīng)的按鈕,就會(huì)彈出一個(gè)對(duì)話框顯示相應(yīng)的內(nèi)容。通過這個(gè)簡(jiǎn)單程序,你可以實(shí)現(xiàn)自己更多、更復(fù)雜的用戶界面程序。    

首先,我們利用單個(gè)監(jiān)聽器來實(shí)現(xiàn)該程序。我們定義一個(gè)名為Simple1的類來包括所有代碼。所有的用戶行為(如點(diǎn)擊按鈕)由一個(gè)監(jiān)聽器SimpleListenner中的actionPerformed方法來處理。以下是代碼:


/*
* Simple1.java - 處理事件的第一種方法
*    在這個(gè)例子中,利用一個(gè)ActionListener來監(jiān)聽事件源產(chǎn)生的事件
*    用一些if語句來決定是哪個(gè)事件源
*/


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Simple1
{
   private static JFrame frame;   // 定義為靜態(tài)變量以便main使用
   private static JPanel myPanel; // 該面板用來放置按鈕組件
   private JButton button1;       // 這里定義按鈕組件    
   private JButton button2;       // 以便讓ActionListener使用
   
   public Simple1()               // 構(gòu)造器, 建立圖形界面
   {
       // 新建面板
       myPanel = new JPanel();
       // 新建按鈕
       button1 = new JButton("按鈕1");  // 新建按鈕1
       button2 = new JButton("按鈕2");

       SimpleListener ourListener = new SimpleListener();
// 建立一個(gè)actionlistener讓兩個(gè)按鈕共享
       button1.addActionListener(ourListener);
       button2.addActionListener(ourListener);

       myPanel.add(button1); // 添加按鈕到面板
       myPanel.add(button2);
   }

   private class SimpleListener implements ActionListener
   {
   /*
    * 利用該內(nèi)部類來監(jiān)聽所有事件源產(chǎn)生的事件
    * 便于處理事件代碼模塊化
    */
       public void actionPerformed(ActionEvent e)
       {
           // 利用getActionCommand獲得按鈕名稱
           // 也可以利用getSource()來實(shí)現(xiàn)
           // if (e.getSource() ==button1)

           String buttonName = e.getActionCommand();
           if (buttonName.equals("按鈕1"))
               JOptionPane.showMessageDialog(frame,
                                           "按鈕1 被點(diǎn)擊");
           else if (buttonName.equals("按鈕2"))
               JOptionPane.showMessageDialog(frame,
                                           "按鈕2 被點(diǎn)擊");
           else
               JOptionPane.showMessageDialog(frame,
                                           "Unknown event" );
       }
   }

   public static void main(String s[])
   {
       Simple1 gui = new Simple1(); // 新建Simple1組件
       
       frame = new JFrame("Simple1");  // 新建JFrame
       // 處理關(guān)閉事件的通常方法
       frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e)
             {System.exit(0);} });

       frame.getContentPane().add(myPanel);
       frame.pack();                  
       frame.setVisible(true);
   }
}

讓我們來看看以上代碼是如何工作的。在main方法中,我們定義了一個(gè)JFrame,然后將面板Jpanel添加到窗體中,該面板包括兩個(gè)按鈕。相應(yīng)的變量Frame,button1,button2定義在程序的開頭部分。

在程序入口main方法中,首先新建Simple1組件,通過構(gòu)造器建立用戶GUI,定義一個(gè)面板Jpanle,,增加兩個(gè)按鈕,然后利用JButton.addActionListerner將兩個(gè)按鈕加入到一個(gè)活動(dòng)監(jiān)聽器SimpleLister中,最后,兩個(gè)按鈕添加到面板。當(dāng)GUI建立后,我們將面板添加到窗體并顯示結(jié)果。當(dāng)用戶點(diǎn)擊按鈕時(shí),程序調(diào)用actionPerformed方法,通過if語句來判斷是哪一個(gè)按鈕被點(diǎn)擊,然后在對(duì)話框中顯示相應(yīng)的內(nèi)容。

利用一個(gè)監(jiān)聽器來處理事件的缺點(diǎn)是,當(dāng)程序比較復(fù)雜時(shí),需要一大串的if 語句來實(shí)現(xiàn),程序代碼較難閱讀與維護(hù)。當(dāng)然,如果處理的事件較少,這種方式比較簡(jiǎn)單。

通過使用匿名內(nèi)部類可以解決上述存在的問題。使用簡(jiǎn)單的匿名內(nèi)部類作為addActionListener的變量即可。以下是實(shí)現(xiàn)代碼:


/*
* Simple2.java - 處理事件的第二種方法
*    在這個(gè)例子中,利用匿名內(nèi)部類來監(jiān)聽每一個(gè)事件源產(chǎn)生的事件
*    避免使用一些if語句來決定是哪個(gè)事件源
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Simple2
{
   private static JFrame frame;   // 定義為靜態(tài)變量以便main使用
   private static JPanel myPanel; // 該面板用來放置按鈕組件
   private JButton button1;       // 這里定義按鈕組件    
   private JButton button2;       // 以便讓ActionListener使用
   
   public Simple2()               // 構(gòu)造器, 建立圖形界面
    {
       // 新建面板
       myPanel = new JPanel();
       // 新建按鈕
       button1 = new JButton("按鈕1");  // 新建按鈕1
       button2 = new JButton("按鈕2");

       // 每一個(gè)事件源需要一個(gè)監(jiān)聽器
       // 定義一個(gè)匿名內(nèi)部類來監(jiān)聽事件源產(chǎn)生的事件
       button1.addActionListener(
           new ActionListener()
           {
               public void actionPerformed(ActionEvent e)
               {
                   JOptionPane.showMessageDialog(frame,
                                          "按鈕1 被點(diǎn)擊");
               }
           }
       );

       button2.addActionListener(
           new ActionListener()
           {
               public void actionPerformed(ActionEvent e)
               {
                   JOptionPane.showMessageDialog(frame,
                                           "按鈕2 被點(diǎn)擊");
               }
           }
       );

       myPanel.add(button1);        // 添加按鈕到面板
       myPanel.add(button2);
   }

   public static void main(String s[])
   {
       Simple2 gui = new Simple2(); // 新建Simple2組件
       
       frame = new JFrame("Simple2");  // 新建JFrame
       // 處理關(guān)閉事件的通常方法
       frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e)
             {System.exit(0);} });
       frame.getContentPane().add(myPanel);
       frame.pack();                  
       frame.setVisible(true);
   }
}

使用匿名內(nèi)部類同樣存在許多另外的問題。首先,根據(jù)組件在代碼中被定義的不同位置,類的定義以及處理事件的代碼將分散在程序的各個(gè)部分,不是集中在一塊,同樣不便于閱讀與維護(hù)。各事件的處理全部由嵌套的程序塊組成,視覺上很難定位程序代碼。如果事件處理程序比較復(fù)雜,內(nèi)部類中的代碼將變得很長(zhǎng),你將找不到相應(yīng)的組件定義位置。最后,當(dāng)工具欄、菜單欄目等需要處理同樣的用戶行為時(shí),該方法將使代碼更難維護(hù)。

我們使用一般的命名內(nèi)部類可以解決以上許多問題。所有的事件處理方法都集中在一塊,并且都具有有意義的名稱,程序非常容易閱讀與維護(hù)。單個(gè)的事件處理程序也可以被工具欄、菜單欄等重復(fù)使用,

以下是實(shí)現(xiàn)代碼:


/*
* Simple3.java - 處理事件的第三種方法
*    For this example, we will use inner member classes to
*    在這個(gè)例子中,利用一般內(nèi)部類來監(jiān)聽每個(gè)事件源產(chǎn)生的事件
*    該方法避免了第二種方法中由于使用匿名內(nèi)部類而導(dǎo)致的代碼混亂
*    便于集中處理事件代碼
*    每一個(gè)Hander可以被工具欄或菜單多次使用
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Simple3
{
   private static JFrame frame;   // 定義為靜態(tài)變量以便main使用
   private static JPanel myPanel; // 該面板用來放置按鈕組件
   private JButton button1;       // 這里定義按鈕組件    
   private JButton button2;       // 以便讓ActionListener使用
       
   // 利用一般內(nèi)部類來監(jiān)聽每一個(gè)事件源產(chǎn)生的事件如(button1, button2)
   private class Button1Handler implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           JOptionPane.showMessageDialog(frame,
                                        "按鈕1 被點(diǎn)擊");
       }
   }
   
   private class Button2Handler implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           JOptionPane.showMessageDialog(frame,
                                        "按鈕2 被點(diǎn)擊");
       }
   }
   
   public Simple3()                //  // 構(gòu)造器, 建立圖形界面
   {
        // 新建面板
       myPanel = new JPanel();
       // 新建按鈕
       button1 = new JButton("按鈕1");  // 新建按鈕1
       button2 = new JButton("按鈕2");

       // 對(duì)每一個(gè)組件注冊(cè)監(jiān)聽內(nèi)部類
       button1.addActionListener(new Button1Handler());
       button2.addActionListener(new Button2Handler());

       myPanel.add(button1);        // 添加按鈕到面板
       myPanel.add(button2);
   }

   public static void main(String s[])
   {
       Simple3 gui = new Simple3();  // 新建Simple3組件

       frame = new JFrame("Simple3");  // 新建JFrame
       // 處理關(guān)閉事件的通常方法        
       frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e)
             {System.exit(0);} });

       frame.getContentPane().add(myPanel);
       frame.pack();                    
       frame.setVisible(true);
   }
}

關(guān)于“Java Swing中事件處理方法有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI