AWT事件處理


AWT事件處理基本概念

AWT事件處理過程中,主要涉及3類對象:

①   Event(事件):用戶對組件的一個操作,稱之為一個事件,以類的形式出現,例如,鍵盤操作對應的事件類是KeyEvent。其實例在該事件發生時由系統自動產生。每一種事件都對應專門的監聽者。

②   Event Source(事件源):事件發生的場所,通常就是各個組件,例如按鈕Button。

③   Event Monitor(事件監聽器):接收事件對象並對其進行處理的類的對象,通常其中某個成員方法對事件進行相應的處理。

注:Java采取了事件委托處理模型,事件源自己不處理事件,而是把其自身所有可能發生的事件委托給事件監聽器來處理。

 

事件:

AWT的相關事件繼承於java.awt.AWTEvent類,這些事件分為兩大類:低級事件和高級事件。

低級事件是值基於組件和容器的事件,當一個組件發生事件,如鼠標進入、點擊、拖放或組件的窗口開關等時,觸發了組件事件。

 

ComponentEvent

組件事件:組件尺寸的變化、移動

ContainerEvent

容器事件:組件增加、移動

WindowEvent

窗口事件:關閉窗口、窗口閉合、圖標化

FocusEvent

焦點事件:焦點的獲得和丟失

KeyEvent

鍵盤事件:鍵按下、釋放

MouseEvent

鼠標事件:鼠標單擊、移動

 

高級事件是基於語義的事件,它可以不和特定的動作相關聯,而依賴觸發此事件的類。比如,在TextField中按下Enter鍵會觸發ActionEvent事件,滑動滾動條會觸發AdjustmentEvent事件,選中列表的某一條就會觸發ItemEvent事件。

 

ActionEvent

動作事件:按鈕按下,TextField中按下Enter鍵

AdjustmentEvent

調節事件:在滾動條上移動滑塊以調節數值

ItemEvent

項目事件:選擇項目,不選擇”項目改變”

TextEvent

文本事件:文本對象改變

 

事件監聽器:

通常是一個類,該類必須實現與該事件類型相對應的接口。對應的接口被稱為事件監聽器接口。事件監聽器接口類的名稱與事件類的名稱相對應。例如,MouseEvent事件類的監聽器接口名為MouseListener。

 

事件適配器類:

Java為一些事件監聽器接口提供了適配器類(Adapter)。我們可以通過繼承事件所對應的Adapter類,重寫所需要的方法,無關的方法則不用實現。事件適配器為我們提供了一種簡單的實現監聽器的手段,可以縮短程序代碼。

Java.awt.event包中定義的事件適配器類包括以下7個:

①   MouseAdapter(鼠標適配器)

②   MouseMotionAdapter(鼠標運動適配器)

③   KetAdapter(鍵盤適配器)

④   WindowAdapter(窗口適配器)

⑤   ComponentAdapter(組件適配器)

⑥   ContainerAdapter(容器適配器)

⑦   FocusAdapter(焦點適配器)

 

在上一篇卡片布局中實現按鈕翻動效果及窗口關閉等事件

在方法中添加

 1     private void registerListener() {  2         // 產生一個事件監聽器對象
 3         BtnListener btnListener = new BtnListener();  4         // 給4個按鈕注冊監聽同一個事件監聽器
 5  btnFirst.addActionListener(btnListener);  6  btnPrevious.addActionListener(btnListener);  7  btnNext.addActionListener(btnListener);  8  btnLast.addActionListener(btnListener);  9         
10         //第一張中鼠標移動事件,顯示坐標
11         lb1.addMouseMotionListener(new MouseAdapter() { 12  @Override 13             public void mouseMoved(MouseEvent e) { 14                 lb1.setText(e.getX() + ":" + e.getY()); 15  } 16  }); 17         
18         //第二張中鼠標移入、移出事件
19         lb2.addMouseListener(new MouseAdapter() { 20  @Override 21             public void mouseExited(MouseEvent e) { 22                 System.out.println("鼠標移出"); 23  } 24             
25  @Override 26             public void mouseEntered(MouseEvent e) { 27                 System.out.println("鼠標移入"); 28  } 29  }); 30         
31         //文本中鍵盤按下事件
32         txtContent.addKeyListener(new KeyAdapter() { 33  @Override 34             public void keyPressed(KeyEvent e) { 35  System.out.println(e.getKeyChar()); 36  } 37  }); 38         
39         //窗口關閉事件
40         this.addWindowListener(new WindowAdapter() { 41  @Override 42             public void windowClosing(WindowEvent e) { 43                 System.exit(0); 44  } 45  }); 46  } 47 
48     // 成員內部類
49     class BtnListener implements ActionListener { 50 
51  @Override 52         public void actionPerformed(ActionEvent e) { 53             /*
54  * System.out.println(e.getActionCommand()); 55  * System.out.println(e.getSource()); 56              */
57             Object obj = e.getSource();// 獲得當前點擊的事件源
58             if (obj == btnFirst) { 59  cardLayout.first(cardPanel); 60             } else if (obj == btnPrevious) { 61  cardLayout.previous(cardPanel); 62             } else if (obj == btnNext) { 63  cardLayout.next(cardPanel); 64             } else if (obj == btnLast) { 65  cardLayout.last(cardPanel); 66  } 67  } 68     }
卡片布局中的方法新增部分

在構造函數中調用方法

 1 super(title); 2 init(); 3 registerListener(); 4  

就可以實現按鈕事件,及上述方法中提及的事件。

完整的方法如下

 1 class MyFrame7 extends Frame {  2     private Panel cardPanel = null;  3     private Panel ctrolPanel = null;  4     private CardLayout cardLayout = null;  5     private FlowLayout flowLayout = null;  6     private Label lb1, lb2, lb3, lb4;  7     private Button btnFirst, btnPrevious, btnNext, btnLast;  8     private TextField txtContent;  9 
 10     public MyFrame7(String title) {  11         super(title);  12  init();  13  registerListener();  14  }  15 
 16     public void init() {  17         // 創建2個面板容器
 18         cardPanel = new Panel();  19         ctrolPanel = new Panel();  20 
 21         // 創建2個布局管理器
 22         cardLayout = new CardLayout();  23         flowLayout = new FlowLayout();  24 
 25         // 給容器設置指定的布局管理器
 26         cardPanel.setLayout(cardLayout);// 卡片容器中放置卡片布局
 27         ctrolPanel.setLayout(flowLayout);// 控制容器放置流式布局  28 
 29         // 聲明創建4個標簽控件和一個文本框控件
 30         lb1 = new Label("第一頁內容", Label.CENTER);  31         lb2 = new Label("第二頁內容", Label.CENTER);  32         txtContent = new TextField();// 編輯文本框
 33         lb3 = new Label("第四頁內容", Label.CENTER);  34         lb4 = new Label("第五頁內容", Label.CENTER);  35 
 36         // 構建四個按鈕對象
 37         btnFirst = new Button("第一張");  38         btnPrevious = new Button("上一張");  39         btnNext = new Button("下一張");  40         btnLast = new Button("最后一張");  41  ctrolPanel.add(btnFirst);  42  ctrolPanel.add(btnPrevious);  43  ctrolPanel.add(btnNext);  44  ctrolPanel.add(btnLast);  45 
 46         // 把四個標簽控件和一個文本框控件添加到卡片容器中
 47  cardPanel.add(lb1);  48  cardPanel.add(lb2);  49  cardPanel.add(txtContent);  50  cardPanel.add(lb3);  51  cardPanel.add(lb4);  52         this.add(cardPanel, BorderLayout.CENTER);// 將卡片容器放在中部
 53         this.add(ctrolPanel, BorderLayout.SOUTH);// 將控制容器放在南部
 54         this.setSize(400, 300);  55         this.setVisible(true);  56  }  57 
 58     private void registerListener() {  59         // 產生一個事件監聽器對象
 60         BtnListener btnListener = new BtnListener();  61         // 給4個按鈕注冊監聽同一個事件監聽器
 62  btnFirst.addActionListener(btnListener);  63  btnPrevious.addActionListener(btnListener);  64  btnNext.addActionListener(btnListener);  65  btnLast.addActionListener(btnListener);  66         
 67         //第一張中鼠標移動事件,顯示坐標
 68         lb1.addMouseMotionListener(new MouseAdapter() {  69  @Override  70             public void mouseMoved(MouseEvent e) {  71                 lb1.setText(e.getX() + ":" + e.getY());  72  }  73  });  74         
 75         //第二張中鼠標移入、移出事件
 76         lb2.addMouseListener(new MouseAdapter() {  77  @Override  78             public void mouseExited(MouseEvent e) {  79                 System.out.println("鼠標移出");  80  }  81             
 82  @Override  83             public void mouseEntered(MouseEvent e) {  84                 System.out.println("鼠標移入");  85  }  86  });  87         
 88         //文本中鍵盤按下事件
 89         txtContent.addKeyListener(new KeyAdapter() {  90  @Override  91             public void keyPressed(KeyEvent e) {  92  System.out.println(e.getKeyChar());  93  }  94  });  95         
 96         //窗口關閉事件
 97         this.addWindowListener(new WindowAdapter() {  98  @Override  99             public void windowClosing(WindowEvent e) { 100                 System.exit(0); 101  } 102  }); 103  } 104 
105     // 成員內部類
106     class BtnListener implements ActionListener { 107 
108  @Override 109         public void actionPerformed(ActionEvent e) { 110             /*
111  * System.out.println(e.getActionCommand()); 112  * System.out.println(e.getSource()); 113              */
114             Object obj = e.getSource();// 獲得當前點擊的事件源
115             if (obj == btnFirst) { 116  cardLayout.first(cardPanel); 117             } else if (obj == btnPrevious) { 118  cardLayout.previous(cardPanel); 119             } else if (obj == btnNext) { 120  cardLayout.next(cardPanel); 121             } else if (obj == btnLast) { 122  cardLayout.last(cardPanel); 123  } 124  } 125  } 126 }

只需在主方法中實例化就可以使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM