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

淺析Swing線程中的LookupEvent

開發(fā) 后端
本文簡(jiǎn)單介紹Swing線程中的LookupEvent,我們把lookup調(diào)用抽象到一個(gè)叫LookupManager的類中,這將允許我們將所有UI類中的數(shù)據(jù)庫(kù)邏輯移出,并最終允許我們完全將這兩者脫耦。

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

讓我們考慮一下像Java消息服務(wù)(JMS)這樣的基于消息的系統(tǒng),因?yàn)樗鼈兲峁┝嗽诋惒江h(huán)境中功能組件之間的松散耦合。消息系統(tǒng)觸發(fā)異步事件,正如在Enterprise Integration Patterns 中描述的。感興趣的參與者監(jiān)聽該事件,并對(duì)事件做成響應(yīng)--通常通過(guò)執(zhí)行它們自己的一些代碼。結(jié)果是一組模塊化的,松散耦合的組件,組件可以添加到或者從系統(tǒng)中去除而不影響到其它組件。更重要的,組件之間的依賴被最小化了,而每一個(gè)組件都是良好定義的和封裝的--每一個(gè)都僅對(duì)自己的工作負(fù)責(zé)。它們簡(jiǎn)單地觸發(fā)消息,其它一些組件將響應(yīng)這個(gè)消息,并對(duì)其它組件觸發(fā)的消息進(jìn)行響應(yīng)。

現(xiàn)在,我們先忽略線程問(wèn)題,將組件解耦并移植到異步環(huán)境中。在我們解決了異步問(wèn)題后,我們將回過(guò)頭來(lái)看看線程問(wèn)題。正如我們所將要看到的,那時(shí)解決這個(gè)問(wèn)題將非常容易。

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

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

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

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

遵守Java的標(biāo)準(zhǔn),我們創(chuàng)建另外一個(gè)稱作LookupEvent的類包含結(jié)果字串?dāng)?shù)組,而不是到處直接傳遞字串?dāng)?shù)組。這將允許我們?cè)诓桓淖僉ookupListener接口的情況下傳遞其它信息。例如,我們可以在LookupEvent中同時(shí)包括查找的字串和結(jié)果。下面是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類是不可變的。這是很重要的,因?yàn)槲覀儾⒉恢涝趥鬟f過(guò)程中誰(shuí)將處理這些事件。除非我們創(chuàng)建事件的保護(hù)拷貝來(lái)傳遞給每一個(gè)監(jiān)聽者,我們需要把事件做成不可變的。如果不這樣,一個(gè)監(jiān)聽者可能會(huì)無(wú)意或者惡意地修訂事件對(duì)象,并破壞系統(tǒng)。
現(xiàn)在我們需要在LookupManager上調(diào)用lookupComplete()事件。我們首先要在LookupManager上添加一個(gè)LookupListener的集合:

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

當(dāng)動(dòng)作發(fā)生時(shí),我們需要調(diào)用監(jiān)聽者的代碼。在我們的例子中,我們將在查找返回時(shí)觸發(fā)一個(gè)lookupCompleted()事件。這意味著在監(jiān)聽者集合上迭代,并使用一個(gè)LookupEvent事件對(duì)象調(diào)用它們的lookupCompleted()方法。
我喜歡把這些代碼析取到一個(gè)獨(dú)立的方法fire[event-method-name] ,其中構(gòu)造一個(gè)事件對(duì)象,在監(jiān)聽器集合上迭代,并調(diào)用每一個(gè)監(jiān)聽器上的適當(dāng)?shù)姆椒?。這有助于隔離主要邏輯代碼和調(diào)用監(jiān)聽器的代碼。下面是我們的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線程中調(diào)用,因?yàn)樵撌录侵苯釉贚ookupManager中觸發(fā)的,這將不是在Swing線程中執(zhí)行。因?yàn)樗械拇a功能上都是異步的(我們不必等待監(jiān)聽器方法允許結(jié)束后才調(diào)用其它代碼),我們可以通過(guò)SwingUtilities.invokeLater()將這些代碼改道到Swing線程。下面是新的方法,傳入一個(gè)匿名Runnable到SwingUtilities.invokeLater():

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

【編輯推薦】

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

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任務(wù)Swing線程

2009-07-10 10:37:50

Swing Set示例

2009-07-15 10:06:54

Swing實(shí)現(xiàn)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項(xiàng)目

2009-07-16 17:01:09

Swing字符串

2009-07-15 13:46:26

Swing體系結(jié)構(gòu)

2023-06-23 15:22:28

JettyJava

2009-07-10 17:24:07

Swing應(yīng)用程序

2009-07-15 17:33:08

Swing客戶端

2009-07-14 14:00:47

iData技術(shù)

2009-07-14 15:12:36

SwingSWT和AWT

2012-01-17 16:41:08

JavaSwing
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美激情a∨在线视频播放 成人免费共享视频 | 波多野吉衣久久 | 亚洲精品在线看 | 成人国产精品久久 | 日本网站免费在线观看 | 99热精品国产 | 福利网站在线观看 | 日韩高清一区二区 | 国产精品视频999 | 国产欧美日韩一区二区三区在线 | 日韩一区二区免费视频 | h免费观看 | 91精品国产综合久久婷婷香蕉 | 欧美在线a | 免费精品久久久久久中文字幕 | 福利片一区二区 | 欧美激情精品久久久久 | 久久精品中文字幕 | 国产精品久久久久婷婷二区次 | 国产日韩欧美一区 | 国产一区二区激情视频 | 成人高清视频在线观看 | 日本涩涩网 | 91视频一区二区三区 | 亚洲一区二区三区免费视频 | 久久综合伊人一区二区三 | 欧州一区二区三区 | 日韩在线一区二区三区 | 中文字幕 在线观看 | 欧美日韩在线一区二区 | 久久久精品影院 | 一区二区在线免费播放 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 国产视频久久 | 天堂成人国产精品一区 | 亚洲国产第一页 | 国产传媒在线播放 | 国产精品伦理一区 | 91在线精品视频 | 超碰91在线 | 超碰人人做 |