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 }
只需在主方法中實例化就可以使用

