比較Java Swing中三種註冊事件的方法

8563084發表於2020-12-25

Swing 是目前Java中不可缺少的視窗工具組,是建立圖形化使用者介面(GUI)程式的強大工具。Java Swing元件自動產生各種事件來響應使用者行為。Java將事件封裝成事件類,並且為每個事件類定義了一個事件監聽器。一個元件註冊事件監聽器方法,表明該元件要響應指定事件。也就是說我們可以通過註冊監聽器,監聽事件源產生的事件,從而在事件處理程式中處理我們所需要處理的使用者行為。

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

1.  新建一個元件。
2.  將該元件新增到相應的皮膚。
3.  註冊監聽器以監聽事件源產生的事件
4.  定義處理事件的方法。

註冊事件我們一般採用兩種方式:

一:利用一個監聽器以及多個if語句來決定是哪個元件產生的事件;
二:使用多個內部類來響應不同元件產生的各種事件,它又分兩種方式,一種是採用匿名內部類,一種是採用一般內部類。

下面我們採用以上三種方式來註冊事件。來說明以上三種方式是如何實現事件的處理方法。

一、採用一個監聽器多個if語句來實現

在這種方式下:我們要繼承ActionListener介面,並且要實現actionPerformed方法。通過getActionCommand()方法來獲取事件的事件源。

 1 public class Test_01 extends JFrame implements ActionListener {
 2 
 3     Test_01() {
 4         JPanel panel = new JPanel();
 5         JButton button1 = new JButton("按鈕一");
 6         JButton button2 = new JButton("按鈕二");
 7 
 8         panel.add(button1);
 9         panel.add(button2);10         this.getContentPane().add(panel);11         this.setVisible(true);12         13         button1.addActionListener(this);14         button2.addActionListener(this);15 16     }17 18     public void actionPerformed(ActionEvent e) {19         String source = e.getActionCommand();20         if (source.equals("按鈕一")) {21             System.out.println("你按了按鈕一");22         }23         if (source.equals("按鈕二")) {24             System.out.println("你按了按鈕二");25         }26     }27 28     public static void main(String args[]) {29         new Test_01();30 31     }32 }

利用一個監聽器來處理事件的缺點是:其實當處理的事件比較少的時候,這種方式還是一種比較好的方式,它簡單。當程式比較複雜時,需要一大串的if語句來實現。程式的程式碼比較難閱讀和維護。

一、利用匿名內部類來是實現

使用匿名內部類來實現可以解決使用if來獲取事件源帶來的麻煩。但是使用匿名內部類同樣存在著一些問題。由於它是和事件組一起的。根據事件組在程式碼中的位置不同,類的定義以及處理事件,同樣不便於閱讀。如果事件處理程式比較複雜,內部類中的程式碼就會變的很長。

 1 public class Test_02 extends JFrame{
 2     
 3     Test_02(){
 4         JPanel panel = new JPanel();
 5         JButton button1 = new JButton("按鈕一");
 6         JButton button2 = new JButton("按鈕二");
 7 
 8         panel.add(button1);
 9         panel.add(button2);10         this.getContentPane().add(panel);11         this.setVisible(true);12         13         button1.addActionListener(14                 new ActionListener(){15                     public void actionPerformed(ActionEvent e) {16                         System.out.println("你按了按鈕一");17                     }18                 });19         button2.addActionListener(20                 new ActionListener(){21                     public void actionPerformed(ActionEvent e) {22                         System.out.println("你按了按鈕二");23                     }24                 });25     }26     27     public static void main(String args[]){28         new Test_02();29     }30 }

三、利用一般內部類來實現

 1 public class Test_03 extends JFrame{
 2 
 3     Test_03(){
 4         JPanel panel = new JPanel();
 5         JButton button1 = new JButton("按鈕一");
 6         JButton button2 = new JButton("按鈕二");
 7 
 8         panel.add(button1);
 9         panel.add(button2);10         this.getContentPane().add(panel);11         this.setVisible(true);12         13         button1.addActionListener(new Button1ActionListener());14         button2.addActionListener(new Button2ActionListener());15         16     }17     18     private class Button1ActionListener implements ActionListener{19         public void actionPerformed(ActionEvent e) {20             System.out.println("你按了按鈕一");    21         }    22     }23     24     private class Button2ActionListener implements ActionListener{25         public void actionPerformed(ActionEvent e) {26             System.out.println("你按了按鈕二");    27         }    28     }29     30     public static void main(String[] args) {31         new Test_03();32     }33 34 }

利用一般內部類我們可以解決很多的問題,該方法避免了第二種方法中由於使用匿名內部類而導致的程式碼混亂。它把所有的事件處理方法都集中在一塊,並且都具有有意義的名稱,程式非常容易閱讀與維護。單個的事件處理程式也可以被工具欄、選單欄等重複使用。



威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人娛樂【886699.bet】 威尼斯人網址【886699.bet】 威尼斯人網址【886699.bet】 威尼斯人網址【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 澳門威尼斯人【886699.bet】 萬博【886699.bet】 萬博體育【886699.bet】 萬博體育【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 新葡京【886699.bet】 葡京 娛 樂 場【886699.bet】 葡京 娛 樂 場【886699.bet】 葡京 娛 樂 場【886699.bet】 葡京 娛 樂 場【886699.bet】 葡京 娛 樂 場【886699.bet】 葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京 娛 樂 場【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京網址【886699.bet】 新葡京 賭 場【886699.bet】 新葡京 賭 場【886699.bet】 新葡京 賭 場【886699.bet】 新葡京 賭 場【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】 新葡京 棋 牌【886699.bet】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989885/viewspace-2745159/,如需轉載,請註明出處,否則將追究法律責任。

相關文章