AWT事件處理

来源:http://www.cnblogs.com/wzy330782/archive/2016/04/24/5428716.html
-Advertisement-
Play Games

AWT事件處理基本概念 AWT事件處理過程中,主要涉及3類對象: ① Event(事件):用戶對組件的一個操作,稱之為一個事件,以類的形式出現,例如,鍵盤操作對應的事件類是KeyEvent。其實例在該事件發生時由系統自動產生。每一種事件都對應專門的監聽者。 ② Event Source(事件源):事 ...


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 }

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文目的 PHP的全局錯誤處理,在開發項目的時候很有用,可以幫助開發者快速定位一些問題,提高工作效率。預設情況下,全局錯誤會直接輸出,但是最近開發時使用的一個框架庫對全局錯誤處理進行了設定,導致很多錯誤信息沒有輸出,在定位問題上有一定的耗時。所以,研究了一下此庫的實現,發現它設定了error_rep ...
  • 什麼是Queue集合? 答:Queue用於模擬隊列這種數據結構。隊列通常是指“先進先出(FIFO)”的容器。隊列的頭部保存在隊列中存放時間最長的元素,尾部保存存放時間最短的元素。新元素插入到隊列的尾部,取出元素會返回隊列頭部的元素。通常,隊列不允許隨機訪問隊列中的元素。 Queue介面中定義瞭如下的 ...
  • “這裡要用char類型”; “這裡要用int類型”; “其實實現這個方法只需要把另一個方法的返回值的類型和傳入參數的類型改成float類型就實現了”; “其實這個演算法只需要把以前寫的那個稍微改動一下就行了”; ……………… 學過面向對象語言的都知道GP這個概念,就是泛型程式設計,說的再明白點就是編寫 ...
  • Java併發編程系列【未完】: Java 併發編程:核心理論 Java併發編程:Synchronized及其實現原理 Java併發編程:Synchronized底層優化(輕量級鎖、偏向鎖) 一、重量級鎖 上篇文章中向大家介紹了Synchronized的用法及其實現的原理。現在我們應該知道,Synch ...
  • 微信支付介面文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道這個jsapi是不能離開微信進行調用支付的,明白了這個道理我們好下手,頁面是在微信內顯示並通過jsapi調用微信支付組件進行支付。 可以看看我們上一 ...
  • 下載頁: http://www.rabbitmq.com/install-standalone-mac.html 1、下載頁面首部的文件(頁面下載可能比較慢,使用迅雷下載就好),之後解壓到一個合適的路徑(例如:/Users/enniu1/Desktop/zjg/)。 2、配置命令訪問路徑 cd ~ ...
  • 上一篇文末,提到非虛擬介面 NVI 的實現,即將虛函數聲明為保護型或私有型,藉由模板函數模式來實現 。 園友 @KillU 看的很仔細,提出了一個問題:虛函數是 private 類型,繼承可以麽? 答案是:完全可以 5 實現權和調用權 <Effective C++> 中給的解釋是: 重寫一個虛函數, ...
  • 圖片上傳 Index.php文件代碼: upload.php代碼: 圖片上傳步驟: 1:接收參數 2:判斷錯誤 3:判斷格式是否合法 4:判斷文件大小 5:判斷是是不是真正的圖片 6:判斷是否是http post提交 文件上傳 Index.php文件代碼: <!DOCTYPE html> <html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...