日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Swing應(yīng)用程序處理函數(shù)

Swing的事件處理過(guò)程為:事件調(diào)度線程(Event Dispatch Thread)從事件隊(duì)列(EventQueue)中獲取底層系統(tǒng)捕獲的原生事件,如鼠標(biāo)、鍵盤(pán)、焦點(diǎn)、PAINT事件等。接著調(diào)用該事件源組件的 dispachEvent。該方法過(guò)濾出特殊事件后,調(diào)用processEvent進(jìn)行處理。processEvent方法根據(jù)事件類(lèi)型調(diào)用注冊(cè)在這個(gè)組件上的相應(yīng)事件處理器函數(shù)。事件處理器函數(shù)根據(jù)這些事件的特征,判斷出用戶的期望行為,然后根據(jù)期望行為改變組件的狀態(tài),然后根據(jù)需要刷新組件外觀,觸發(fā)帶有特定語(yǔ)義的高級(jí)事件。此事件繼續(xù)傳播下去,直至調(diào)用Swing應(yīng)用程序注冊(cè)在該組件上的處理器函數(shù).

成都創(chuàng)新互聯(lián)是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的成都棕樹(shù)電信機(jī)房服務(wù)

事件調(diào)度線程在Swing應(yīng)用程序事件處理函數(shù)actionPerformed沒(méi)有完成之前是不能處理下一個(gè)事件的,如果Swing應(yīng)用程序處理函數(shù)是一個(gè)時(shí)間復(fù)雜的任務(wù)(比如查詢數(shù)據(jù)庫(kù)并將結(jié)果顯示到表格中),后面包括PAINT事件將在長(zhǎng)時(shí)間內(nèi)得不到執(zhí)行。由于PAINT事件負(fù)責(zé)將界面更新,所以這就使用戶界面失去響應(yīng)。

打一個(gè)比方,事件處理線程就像進(jìn)入某城唯一的單行道一樣,事件相當(dāng)于汽車(chē)。有種PAINT汽車(chē)負(fù)責(zé)為城市運(yùn)輸非常重要的生活物資。但是有一天,PAINT 前面有一輛汽車(chē)突然壞掉了,司機(jī)下來(lái)修車(chē)。但是這車(chē)太難修,一修就是幾天,結(jié)果后面的PAINT汽車(chē)無(wú)法前進(jìn),物資無(wú)法按時(shí)運(yùn)到城里。市民急了,市長(zhǎng)雖然不停的打電話催PAINT公司,但即使PAINT公司多添加幾輛車(chē)也沒(méi)用。由于進(jìn)城的唯一條路被那輛車(chē)給占著,所以再多的PAINT車(chē)也只能堵在路上。

不了解Swing的這種事件處理模型的人往往將時(shí)間復(fù)雜的任務(wù)放在處理函數(shù)中完成,這是造成Swing應(yīng)用程序速度很慢的原因。用戶觸發(fā)這個(gè)動(dòng)作,用戶界面就失去了響應(yīng),于是給用戶的感覺(jué)就是Swing太慢了。其實(shí)這個(gè)錯(cuò)誤是程序員造成的,并不是Swing的過(guò)失。

那么如何避免這個(gè)問(wèn)題,編寫(xiě)響應(yīng)速度快的Swing應(yīng)用程序呢?在SwingWorker的javadoc中有這樣兩條原則:

◆Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive. 耗時(shí)任務(wù)不要放到事件調(diào)度線程上執(zhí)行,否則程序就會(huì)失去響應(yīng)。

◆Swing components should be accessed on the Event Dispatch Thread only. Swing組件只能在事件調(diào)度線程上訪問(wèn)。

因此處理耗時(shí)任務(wù)時(shí),首先要啟動(dòng)一個(gè)專(zhuān)門(mén)線程,將當(dāng)前任務(wù)交給這個(gè)線程處理,而當(dāng)前處理函數(shù)立即返回,繼續(xù)處理后面未決的事件。這就像前面塞車(chē)的例子似的,那個(gè)司機(jī)只要簡(jiǎn)單的把車(chē)開(kāi)到路邊或者人行道上修理,整個(gè)公路系統(tǒng)就會(huì)恢復(fù)運(yùn)轉(zhuǎn)。

其次,在為耗時(shí)任務(wù)啟動(dòng)的線程訪問(wèn)Swing組件時(shí),要使用SwingUtilties. invokeLater或者SwingUtilities.invokeAndWait 來(lái)訪問(wèn),invokeLater和invokeAndWait的參數(shù)都是一個(gè)Runnable對(duì)象,這個(gè)Runnable對(duì)象將被像普通事件處理函數(shù)一樣在事件調(diào)度線程上執(zhí)行。這兩個(gè)函數(shù)的區(qū)別是,invokeLater不阻塞當(dāng)前任務(wù)線程,invokeAndWait阻塞當(dāng)前線程,直到Runnable 對(duì)象被執(zhí)行返回才繼續(xù)。在前面塞車(chē)的例子中,司機(jī)在路邊修車(chē)解決了塞車(chē)問(wèn)題,但是他突然想起來(lái)要家里辦些事情,這時(shí)他就可以打個(gè)電話讓家里開(kāi)車(chē)來(lái)。假如修車(chē)不受這件事情的影響,比如叫家人送他朋友一本書(shū),他可以繼續(xù)修車(chē),這時(shí)就相當(dāng)于invokeLater;假如修車(chē)受影響,比如缺少某個(gè)汽車(chē)零件,叫家人給他送過(guò)來(lái),那么在家人來(lái)之前,他就沒(méi)法繼續(xù)修車(chē),這時(shí)就相當(dāng)于invokeAndWait。

下面舉一個(gè)例子說(shuō)明這兩點(diǎn),比如按下查詢按鈕,查詢數(shù)據(jù)量很大的數(shù)據(jù)庫(kù),并顯示在一個(gè)表中,這個(gè)過(guò)程需要給用戶一個(gè)進(jìn)度提示,并且能動(dòng)態(tài)顯示表格數(shù)據(jù)動(dòng)態(tài)增加的過(guò)程。假設(shè)按鈕的處理函數(shù)是myButton_actionPerformed,則:

 
 
 
  1. voidmyButton_actionPerformed(ActionEventevt){  
  2. newMyQueryTask().start();  
  3. }  
  4. publicclassMyQueryTaskextendsThread{  
  5. publicvoidrun(){  
  6. //查詢數(shù)據(jù)庫(kù)  
  7. finalResultSetresult=...;  
  8. //顯示記錄  
  9. for(;result.next();){  
  10. //往表的Model中添加一行數(shù)據(jù),并更新進(jìn)度條,注意這都是訪問(wèn)組件  
  11. SwingUtilities.invokeLater(newRunnable(){  
  12. publicvoidrun(){  
  13. addRecord(result);  
  14. }  
  15. });  
  16. }  
  17. ....  
  18. }  
  19. voidaddRecord(ResultSetresult){  
  20. //往表格中添加數(shù)據(jù)  
  21. jTable.add....  
  22. //更新進(jìn)度條  
  23. jProgress.setValue(....);  
  24. }  

【編輯推薦】

  1. 概述Swing窗體的種類(lèi)
  2. 淺談Swing線程三種
  3. Swing全屏幕模式
  4. 淺析Swing線程中的LookupEvent
  5. Swing文件選擇器的制作

分享題目:Swing應(yīng)用程序處理函數(shù)
本文地址:http://m.5511xx.com/article/ccsohpe.html