成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Swing線程中的LookupEvent

開發 后端
本文簡單介紹Swing線程中的LookupEvent,我們把lookup調用抽象到一個叫LookupManager的類中,這將允許我們將所有UI類中的數據庫邏輯移出,并最終允許我們完全將這兩者脫耦。

所有前面的這些解決方案都存在一個共同的致命缺陷--企圖在持續地改變線程的同時表示一個任務的功能集。但是改變線程需要異步的模型,而線程異步地處理Runnable。問題的部分原因是我們在企圖在一個異步的線程模型之上實現一個同步的模型。這是所有Runnable之間的鏈和依賴,執行順序和內部類scooping問題的根源。如果我們可以構建真正的異步,我們就可以解決我們的問題并極大地簡化Swing線程。

讓我們考慮一下像Java消息服務(JMS)這樣的基于消息的系統,因為它們提供了在異步環境中功能組件之間的松散耦合。消息系統觸發異步事件,正如在Enterprise Integration Patterns 中描述的。感興趣的參與者監聽該事件,并對事件做成響應--通常通過執行它們自己的一些代碼。結果是一組模塊化的,松散耦合的組件,組件可以添加到或者從系統中去除而不影響到其它組件。更重要的,組件之間的依賴被最小化了,而每一個組件都是良好定義的和封裝的--每一個都僅對自己的工作負責。它們簡單地觸發消息,其它一些組件將響應這個消息,并對其它組件觸發的消息進行響應。

現在,我們先忽略線程問題,將組件解耦并移植到異步環境中。在我們解決了異步問題后,我們將回過頭來看看線程問題。正如我們所將要看到的,那時解決這個問題將非常容易。

讓我們還拿前面引入的例子,并把它移植到基于事件的模型。首先,我們把lookup調用抽象到一個叫LookupManager的類中。這將允許我們將所有UI類中的數據庫邏輯移出,并最終允許我們完全將這兩者脫耦。下面是LookupManager類的代碼:

  1. classLookupManager{  
  2. privateString[]lookup(Stringtext){  
  3. String[]results=...  
  4. //databaselookupcode  
  5. returnresults  
  6. }  

現在我們開始向異步模型轉換。為了使這個調用異步化,我們需要抽象調用的返回。換句話,方法不能返回任何值。我們將以分辨什么相關的動作是其它類所希望知道的開始。在我們這個例子中最明顯的事件是搜索結束事件。所以讓我們創建一個監聽器接口來響應這些事件。該接口含有單個方法lookupCompleted()。下面是接口的定義:

  1. interfaceLookupListener{  
  2. publicvoidlookupCompleted(Iteratorresults);  
  3. }  

遵守Java的標準,我們創建另外一個稱作LookupEvent的類包含結果字串數組,而不是到處直接傳遞字串數組。這將允許我們在不改變LookupListener接口的情況下傳遞其它信息。例如,我們可以在LookupEvent中同時包括查找的字串和結果。下面是LookupEvent類:

  1. publicclassLookupEvent{  
  2. StringsearchText;  
  3. String[]results;  
  4. publicLookupEvent(StringsearchText){  
  5. this.searchText=searchText;  
  6. }  
  7. publicLookupEvent(StringsearchText,  
  8. String[]results){  
  9. this.searchText=searchText;  
  10. this.results=results;  
  11. }  
  12. publicStringgetSearchText(){  
  13. returnsearchText;  
  14. }  
  15. publicString[]getResults(){  
  16. returnresults;  
  17. }  

注意LookupEvent類是不可變的。這是很重要的,因為我們并不知道在傳遞過程中誰將處理這些事件。除非我們創建事件的保護拷貝來傳遞給每一個監聽者,我們需要把事件做成不可變的。如果不這樣,一個監聽者可能會無意或者惡意地修訂事件對象,并破壞系統。
現在我們需要在LookupManager上調用lookupComplete()事件。我們首先要在LookupManager上添加一個LookupListener的集合:

  1. publicvoidaddLookupListener(LookupListenerlistener){  
  2. listeners.add(listener);  
  3. }  
  4. publicvoidremoveLookupListener(LookupListenerlistener){  
  5. listeners.remove(listener);  

當動作發生時,我們需要調用監聽者的代碼。在我們的例子中,我們將在查找返回時觸發一個lookupCompleted()事件。這意味著在監聽者集合上迭代,并使用一個LookupEvent事件對象調用它們的lookupCompleted()方法。
我喜歡把這些代碼析取到一個獨立的方法fire[event-method-name] ,其中構造一個事件對象,在監聽器集合上迭代,并調用每一個監聽器上的適當的方法。這有助于隔離主要邏輯代碼和調用監聽器的代碼。下面是我們的fireLookupCompleted方法:

  1. privatevoidfireLookupCompleted(StringsearchText,  
  2. String[]results){  
  3. LookupEventevent=  
  4. newLookupEvent(searchText,results);  
  5. Iteratoriter=  
  6. newArrayList(listeners).iterator();  
  7. while(iter.hasNext()){  
  8. LookupListenerlistener=  
  9. (LookupListener)iter.next();  
  10. listener.lookupCompleted(event);  
  11. }  

我們知道這將在非Swing線程中調用,因為該事件是直接在LookupManager中觸發的,這將不是在Swing線程中執行。因為所有的代碼功能上都是異步的(我們不必等待監聽器方法允許結束后才調用其它代碼),我們可以通過SwingUtilities.invokeLater()將這些代碼改道到Swing線程。下面是新的方法,傳入一個匿名Runnable到SwingUtilities.invokeLater():

  1. publicvoidlookupCompleted(finalLookupEvente){  
  2. //noticethethreading  
  3. SwingUtilities.invokeLater(  
  4. newRunnable(){  
  5. publicvoidrun(){  
  6. outputTA.setText("");  
  7. Strin 

【編輯推薦】

  1. 介紹Swing線程相關處理
  2. 淺析Swing客戶端知識
  3. Swing線程解決方案
  4. 全面比較AWT和Swing
  5. 概述JSci.swing包的核心
責任編輯:佚名 來源: CSDN博客
相關推薦

2009-07-15 16:03:26

Swing線程

2012-01-17 17:21:24

JavaSwing

2009-07-17 16:41:48

actionPerfoSwing

2009-07-15 11:02:32

Swing組件

2009-07-17 11:30:44

Swing Image

2009-07-16 08:53:03

Swing任務Swing線程

2009-07-10 10:37:50

Swing Set示例

2009-07-15 10:06:54

Swing實現MDI

2009-07-14 15:34:22

Swing中的線程GUI程序

2009-04-30 09:10:42

JavaSwing線程安全

2009-07-10 14:20:01

AcceleratorJava Swing

2009-07-15 16:50:07

Swing項目

2009-07-16 17:01:09

Swing字符串

2009-07-15 13:46:26

Swing體系結構

2023-06-23 15:22:28

JettyJava

2009-07-15 17:33:08

Swing客戶端

2009-07-14 14:00:47

iData技術

2009-07-10 17:24:07

Swing應用程序

2009-07-14 15:12:36

SwingSWT和AWT

2012-01-17 16:41:08

JavaSwing
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片在线观看 | 亚洲精品一区二区三区在线观看 | 久久久青草婷婷精品综合日韩 | 国产精品久久久久久高潮 | 91在线免费观看网站 | 免费在线观看91 | www.日韩| 久久精品在线 | 91精品免费视频 | 免费视频一区二区 | 成人免费视频网站在线看 | 拍真实国产伦偷精品 | 天天看天天操 | 理论片87福利理论电影 | 91高清视频在线 | 91视频18| 日韩在线国产 | 久久久久国产精品午夜一区 | 亚洲男人的天堂网站 | 国产99免费视频 | 免费精品视频在线观看 | 欧美综合一区二区 | 69福利影院 | 日韩无| 综合色在线| 国产精品日产欧美久久久久 | 久久久久综合 | 无码一区二区三区视频 | 影视先锋av资源噜噜 | 久久久欧洲 | 黄色三级在线播放 | 日日操视频 | 色综合天天天天做夜夜夜夜做 | 福利国产 | 91文字幕巨乱亚洲香蕉 | 欧美日韩福利视频 | www.4hu影院 | 久久亚洲一区 | 成人在线视频一区二区三区 | 欧美自拍第一页 | caoporn地址|