国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

全面介紹Java事件處理與發送

2019-11-18 11:48:58
字體:
來源:轉載
供稿:網友

  任何時候,按下鍵盤或鼠標的鍵就產生了事件。組件接受和處理事件的方式自JDK1.1以來都保持不變。Swing組件能夠產生許多不同類別的事件,包括那些在java.awt.event包以及在javax.swing.event包中的事件。Swing新引入的那些事件類別往往是與特定Swing組件相關的。每一個事件類別都是一個對象,它至少指明了事件的發生源,往往還帶有其它消息,如該事件的類別、在事件發生前和發生后事件源狀態的變化,等等。事件源大部分是普通的組件或模型(models, 即MVC中的M,在以后的blog中可能會介紹Swing組件的MVC結構)。其它的對象也可能產生事件。
  
  要想收到事件產生的通知,我們需要在目標對象上注冊事件監聽器。事件監聽器是任意XXListener類或接口的具體實現(XX代指事件的類型)。XXListener是定義在java.awt.event、java.beans和javax.swing.event包中的類或接口。在每個接口中至少定義了一個方法(method),該方法以對應的XXEvent作為參數。支持發送XXEvent事件發生通知的類都須實現XXListener接口,同時提供相應的addXXListener()和removeXXListener()方法來注冊和移除這些事件監聽器,大部分的事件目標對象(target)都答應注冊任意多個事件監聽器。通常支持XXEvent的類都提供受保護的方法(PRotected method)fireXX()來構造事件對象及將它送至事件處理器(event handler)進行處理。
  
  javax.swing.event.EventListenerList類
  
  EventListenerList是一個包含XXEvent/XXListener對(pairs)的陣列(數組)。JComponent及其派生類使用一個EventListenerList對象來維護其事件監聽器。所有默認的模型(models)同樣維護事件監聽器和一個EventListenerList。當一個監聽器被注冊到一個Swing組件或模型(model)時,對應的事件的Class實例(用來標識事件類別)被添加至EventListenerList陣列,后面緊隨該監聽器本身(即一個XXEvent/XXListener對)。因為這些對是儲存在陣列而不是在可變的集合(mutable collection)中(出于對效率的考慮),每一次添加和移除都會調用System.arrayCopy()來生成一個新的陣列。當收到事件時,陣列被遍歷,事件就會被送至擁有其類型的每一個事件監聽器。由于陣列是按XXEvent, XXListener, YYEvent, YYListener, ... 的方式排列的,某個事件類別的監聽器總是緊隨其后。這種方式使得事件處理十分高效。為了線程安全,當從EventListenerList添加和移除監聽器時,方法訪問陣列必須同步。
  
  JComponent定義了一個名為listenerList的受保護EventListListener屬性,因而所有它的子類都繼續了這個屬性。Swing組件直接透過listenerList屬性來治理其大部分事件監聽器。
  
  事件發送線程
  
  事件監聽器在事件發送線程(一個java.awt.EventDispatchThread類的實例)中接受并處理事件。所有的繪制和組件布局也被要求在此線程中發生。事件發送線程在AWT和Swing中具有頭等的重要性,在應用中控制組件狀態和顯示的隨時更新方面扮演著要害的角色。
  
  與此線程相關的是一個事件的FIFO(First In First Out,先進先出)隊列:系統事件隊列(java.awt.EventQueue的一個實例)。跟所有的FIFO隊列一樣,系統事件隊列也是被線性填充的。無論是更新組件屬性,布局,或是重新繪制,每一個請求依次運行事件處理代碼。所有事件被依次處理是為了避免像某個組件的狀態在它重新繪制的中途被意外改變這樣的情況。知道這一點后,我們就要避免在事件發送線程之外去發送事件。比如說,在另一個線程中直接調用fireXX()方法就是不安全的。我們同時也必須保證事件處理代碼和繪制代碼盡快地執行完,否則整個系統隊列就會被阻塞,被迫等待某個事件被處理,重新繪制,或是布局完畢,而我們的應用程序則像是被“凍結”或是失去響應。
  ==============================================================================================
  // Thanks to Matthew Robinson and Pavel Vorobiev, Ph.D for their great book Swing, this article is translated form
  // this book, 1st edition. You can find these text in their book (in English) of Chapter 2.
  =================================================================================
  
  要想收到事件產生的通知,我們需要在目標對象上注冊事件監聽器。事件監聽器是任意XXListener類或接口的具體實現(XX代指事件的類型)。XXListener是定義在java.awt.event、java.beans和javax.swing.event包中的類或接口。在每個接口中至少定義了一個方法(method),該方法以對應的XXEvent作為參數。支持發送XXEvent事件發生通知的類都須實現XXListener接口,同時提供相應的addXXListener()和removeXXListener()方法來注冊和移除這些事件監聽器,大部分的事件目標對象(target)都答應注冊任意多個事件監聽器。通常支持XXEvent的類都提供受保護的方法(protected method)fireXX()來構造事件對象及將它送至事件處理器(event handler)進行處理。
  
  javax.swing.event.EventListenerList類
  
  EventListenerList是一個包含XXEvent/XXListener對(pairs)的陣列(數組)。JComponent及其派生類使用一個EventListenerList對象來維護其事件監聽器。所有默認的模型(models)同樣維護事件監聽器和一個EventListenerList。當一個監聽器被注冊到一個Swing組件或模型(model)時,對應的事件的Class實例(用來標識事件類別)被添加至EventListenerList陣列,后面緊隨該監聽器本身(即一個XXEvent/XXListener對)。因為這些對是儲存在陣列而不是在可變的集合(mutable collection)中(出于對效率的考慮),每一次添加和移除都會調用System.arrayCopy()來生成一個新的陣列。當收到事件時,陣列被遍歷,事件就會被送至擁有其類型的每一個事件監聽器。由于陣列是按XXEvent, XXListener, YYEvent, YYListener, ... 的方式排列的,某個事件類別的監聽器總是緊隨其后。這種方式使得事件處理十分高效。為了線程安全,當從EventListenerList添加和移除監聽器時,方法訪問陣列必須同步。
  
  JComponent定義了一個名為listenerList的受保護EventListListener屬性,因而所有它的子類都繼續了這個屬性。Swing組件直接透過listenerList屬性來治理其大部分事件監聽器。
  
  事件發送線程
  
  事件監聽器在事件發送線程(一個java.awt.EventDispatchThread類的實例)中接受并處理事件。所有的繪制和組件布局也被要求在此線程中發生。事件發送線程在AWT和Swing中具有頭等的重要性,在應用中控制組件狀態和顯示的隨時更新方面扮演著要害的角色。
  
  與此線程相關的是一個事件的FIFO(First In First Out,先進先出)隊列:系統事件隊列(java.awt.EventQueue的一個實例)。跟所有的FIFO隊列一樣,系統事件隊列也是被線性填充的。無論是更新組件屬性,布局,或是重新繪制,每一個請求依次運行事件處理代碼。所有事件被依次處理是為了避免像某個組件的狀態在它重新繪制的中途被意外改變這樣的情況。知道這一點后,我們就要避免在事件發送線程之外去發送事件。比如說,在另一個線程中直接調用fireXX()方法就是不安全的。我們同時也必須保證事件處理代碼和繪制代碼盡快地執行完,否則整個系統隊列就會被阻塞,被迫等待某個事件被處理,重新繪制,或是布局完畢,而我們的應用程序則像是被“凍結”或是失去響應。
  ==============================================================================================
  // Thanks to Matthew Robinson and Pavel Vorobiev, Ph.D for their great book Swing, this article is translated form
  // this book, 1st edition. You can find these text in their book (in English) of Chapter 2.
  =================================================================================
  
  要想收到事件產生的通知,我們需要在目標對象上注冊事件監聽器。事件監聽器是任意XXListener類或接口的具體實現(XX代指事件的類型)。XXListener是定義在java.awt.event、java.beans和javax.swing.event包中的類或接口。在每個接口中至少定義了一個方法(method),該方法以對應的XXEvent作為參數。支持發送XXEvent事件發生通知的類都須實現XXListener接口,同時提供相應的addXXListener()和removeXXListener()方法來注冊和移除這些事件監聽器,大部分的事件目標對象(target)都答應注冊任意多個事件監聽器。通常支持XXEvent的類都提供受保護的方法(protected method)fireXX()來構造事件對象及將它送至事件處理器(event handler)進行處理。
  
  javax.swing.event.EventListenerList類
  
  EventListenerList是一個包含XXEvent/XXListener對(pairs)的陣列(數組)。JComponent及其派生類使用一個EventListenerList對象來維護其事件監聽器。所有默認的模型(models)同樣維護事件監聽器和一個EventListenerList。當一個監聽器被注冊到一個Swing組件或模型(model)時,對應的事件的Class實例(用來標識事件類別)被添加至EventListenerList陣列,后面緊隨該監聽器本身(即一個XXEvent/XXListener對)。因為這些對是儲存在陣列而不是在可變的集合(mutable collection)中(出于對效率的考慮),每一次添加和移除都會調用System.arrayCopy()來生成一個新的陣列。當收到事件時,陣列被遍歷,事件就會被送至擁有其類型的每一個事件監聽器。由于陣列是按XXEvent, XXListener, YYEvent, YYListener, ... 的方式排列的,某個事件類別的監聽器總是緊隨其后。這種方式使得事件處理十分高效。為了線程安全,當從EventListenerList添加和移除監聽器

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福泉市| 若尔盖县| 彰武县| 赤水市| 东阳市| 南漳县| 遂平县| 千阳县| 平南县| 天全县| 兴海县| 年辖:市辖区| 珲春市| 瑞安市| 嘉荫县| 固镇县| 秦皇岛市| 承德县| 越西县| 郑州市| 台东县| 新乡县| 连南| 澄城县| 凯里市| 买车| 明水县| 饶阳县| 四平市| 榆树市| 澎湖县| 清新县| 虞城县| 安徽省| 安福县| 汶川县| 万源市| 千阳县| 眉山市| 汶川县| 涪陵区|