熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java Swing 中三種事件處理方法的比較

2013-11-23 19:11:05  來源: Java核心技術 

  Swing是目前Java中不可缺少的窗口工具組是用戶建立圖形化用戶界面(GUI)程序的強大工具Java Swing組件自動產生各種事件來響應用戶行為如當用戶點擊按鈕或選擇菜單項目時Swing組件會產生一個ActionEventSwing組件會產生許多事件如ActionEventsChangeEventsItemEvents等來響應用戶的鼠標點擊行為列表框中值的改變計時器的開始計時等行為在Java Swing編程中通過注冊監聽器我們可以監聽事件源產生的事件從而在事件處理程序中處理我們所需要處理的用戶行為

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

   新建一個組件(如JButton)

   將該組件添加到相應的面板(如JPanel)

   注冊監聽器以監聽事件源產生的事件(如通過ActionListener來響應用戶點擊按鈕)

   定義處理事件的方法(如在ActionListener中的actionPerformed中定義相應方法)

  以上步驟我們可以用多種方法實現但人們通常用二種方法第一種方法是只利用一個監聽器以及多個if語句來決定是哪個組件產生的事件;第二種方法是使用多個內部類來響應不同組件產生的各種事件其具體實現又分兩種方式一種是匿名內部類一種是一般內部類

  為了說明如何使用上述三種方法實現事件的處理方法我們建立一個簡單的應用程序該程序界面有兩個按鈕當用戶點擊相應的按鈕就會彈出一個對話框顯示相應的內容通過這個簡單程序你可以實現自己更多更復雜的用戶界面程序

  首先我們利用單個監聽器來實現該程序我們定義一個名為Simple的類來包括所有代碼所有的用戶行為(如點擊按鈕)由一個監聽器SimpleListenner中的actionPerformed方法來處理以下是代碼

    /*
  * Simplejava 處理事件的第一種方法
  * 在這個例子中利用一個ActionListener來監聽事件源產生的事件
  * 用一些if語句來決定是哪個事件源
  */
  import javaawt*;
  import javaawtevent*;
  import javaxswing*;
  public class Simple
  {
  private static JFrame frame; // 定義為靜態變量以便main使用

  private static JPanel myPanel; // 該面板用來放置按鈕組件

  private JButton button; // 這裡定義按鈕組件

  private JButton button; // 以便讓ActionListener使用

  public Simple() // 構造器 建立圖形界面

  {
  // 新建面板

  myPanel = new JPanel();
  // 新建按鈕

  button = new JButton(按鈕); // 新建按鈕

  button = new JButton(按鈕);
  SimpleListener ourListener = new SimpleListener();
  // 建立一個actionlistener讓兩個按鈕共享

  buttonaddActionListener(ourListener);
  buttonaddActionListener(ourListener);
  myPaneladd(button); // 添加按鈕到面板

  myPaneladd(button);
  }
  private class SimpleListener implements ActionListener
  {
  /*
  * 利用該內部類來監聽所有事件源產生的事件
  * 便於處理事件代碼模塊化
  */
  public void actionPerformed(ActionEvent e)
  {
  // 利用getActionCommand獲得按鈕名稱
  // 也可以利用getSource()來實現
  // if (egetSource() ==button)

  String buttonName = egetActionCommand();
  if (buttonNameequals(按鈕))
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  else if (buttonNameequals(按鈕))
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  else
  JOptionPaneshowMessageDialog(frame
  Unknown event ;
  }
  }
  public static void main(String s[])
  {
  Simple gui = new Simple(); // 新建Simple組件

  frame = new JFrame(Simple); // 新建JFrame
  // 處理關閉事件的通常方法

  frameaddWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e)
  {Systemexit();} });
  framegetContentPane()add(myPanel);
  framepack();
  framesetVisible(true);
  }
  }

    
    讓我們來看看以上代碼是如何工作的在main方法中我們定義了一個JFrame然後將面板Jpanel添加到窗體中該面板包括兩個按鈕相應的變量Framebuttonbutton定義在程序的開頭部分

  在程序入口main方法中首先新建Simple組件通過構造器建立用戶GUI定義一個面板Jpanle增加兩個按鈕然後利用JButtonaddActionListerner將兩個按鈕加入到一個活動監聽器SimpleLister中最後兩個按鈕添加到面板當GUI建立後我們將面板添加到窗體並顯示結果當用戶點擊按鈕時程序調用actionPerformed方法通過if語句來判斷是哪一個按鈕被點擊然後在對話框中顯示相應的內容

  利用一個監聽器來處理事件的缺點是當程序比較復雜時需要一大串的if 語句來實現程序代碼較難閱讀與維護當然如果處理的事件較少這種方式比較簡單

  通過使用匿名內部類可以解決上述存在的問題使用簡單的匿名內部類作為addActionListener的變量即可以下是實現代碼

  

    /*
  * Simplejava 處理事件的第二種方法
  * 在這個例子中利用匿名內部類來監聽每一個事件源產生的事件
  * 避免使用一些if語句來決定是哪個事件源
  */
  import javaawt*;
  import javaawtevent*;
  import javaxswing*;
  public class Simple
  {
  private static JFrame frame; // 定義為靜態變量以便main使用

  private static JPanel myPanel; // 該面板用來放置按鈕組件

  private JButton button; // 這裡定義按鈕組件

  private JButton button; // 以便讓ActionListener使用

  public Simple() // 構造器 建立圖形界面

  {
  // 新建面板

  myPanel = new JPanel();
  // 新建按鈕

  button = new JButton(按鈕); // 新建按鈕

  button = new JButton(按鈕);
  // 每一個事件源需要一個監聽器
  // 定義一個匿名內部類來監聽事件源產生的事件

  buttonaddActionListener(
  new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  }
  }
  ;
  buttonaddActionListener(
  new ActionListener()
  {
  public void actionPerformed(ActionEvent e)
  {
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  }
  }
  ;
  myPaneladd(button); // 添加按鈕到面板

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

  frame = new JFrame(Simple); // 新建JFrame
  // 處理關閉事件的通常方法

  frameaddWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e)
  {Systemexit();} });
  framegetContentPane()add(myPanel);
  framepack();
  framesetVisible(true);
  }
  }


    
    使用匿名內部類同樣存在許多另外的問題首先根據組件在代碼中被定義的不同位置類的定義以及處理事件的代碼將分散在程序的各個部分不是集中在一塊同樣不便於閱讀與維護各事件的處理全部由嵌套的程序塊組成視覺上很難定位程序代碼如果事件處理程序比較復雜內部類中的代碼將變得很長你將找不到相應的組件定義位置最後當工具欄菜單欄目等需要處理同樣的用戶行為時該方法將使代碼更難維護

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

  以下是實現代碼

    /*
  * Simplejava 處理事件的第三種方法
  * For this example we will use inner member classes to
  * 在這個例子中利用一般內部類來監聽每個事件源產生的事件
  * 該方法避免了第二種方法中由於使用匿名內部類而導致的代碼混亂
  * 便於集中處理事件代碼
  * 每一個Hander可以被工具欄或菜單多次使用
  */
  import javaawt*;
  import javaawtevent*;
  import javaxswing*;
  public class Simple
  {
  private static JFrame frame; // 定義為靜態變量以便main使用

  private static JPanel myPanel; // 該面板用來放置按鈕組件

  private JButton button; // 這裡定義按鈕組件

  private JButton button; // 以便讓ActionListener使用
  // 利用一般內部類來監聽每一個事件源產生的事件如(button button)

  private class ButtonHandler implements ActionListener
  {
  public void actionPerformed(ActionEvent e)
  {
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  }
  }
  private class ButtonHandler implements ActionListener
  {
  public void actionPerformed(ActionEvent e)
  {
  JOptionPaneshowMessageDialog(frame
  按鈕 被點擊);
  }
  }
  public Simple() // // 構造器 建立圖形界面

  {
  // 新建面板

  myPanel = new JPanel();
  // 新建按鈕

  button = new JButton(按鈕); // 新建按鈕

  button = new JButton(按鈕);
  // 對每一個組件注冊監聽內部類

  buttonaddActionListener(new ButtonHandler());
  buttonaddActionListener(new ButtonHandler());
  myPaneladd(button); // 添加按鈕到面板

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

  frame = new JFrame(Simple); // 新建JFrame
  // 處理關閉事件的通常方法

  frameaddWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e)
  {Systemexit();} });
  framegetContentPane()add(myPanel);
  framepack();
  framesetVisible(true);
  }
  }
    
    以上分析了在Java Swing中三種事件的處理方式其中利用一般內部類來實現的方法從代碼書寫閱讀維護以及程序的可擴展性角度來看最為值得推薦供大家使用


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26407.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.