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

Swing應用程序處理函數

開發 后端
本文介紹Swing應用程序處理函數,processEvent方法根據事件類型調用注冊在這個組件上的相應事件處理器函數。

Swing的事件處理過程為:事件調度線程(Event Dispatch Thread)從事件隊列(EventQueue)中獲取底層系統捕獲的原生事件,如鼠標、鍵盤、焦點、PAINT事件等。接著調用該事件源組件的 dispachEvent。該方法過濾出特殊事件后,調用processEvent進行處理。processEvent方法根據事件類型調用注冊在這個組件上的相應事件處理器函數。事件處理器函數根據這些事件的特征,判斷出用戶的期望行為,然后根據期望行為改變組件的狀態,然后根據需要刷新組件外觀,觸發帶有特定語義的高級事件。此事件繼續傳播下去,直至調用Swing應用程序注冊在該組件上的處理器函數.

事件調度線程在Swing應用程序事件處理函數actionPerformed沒有完成之前是不能處理下一個事件的,如果Swing應用程序處理函數是一個時間復雜的任務(比如查詢數據庫并將結果顯示到表格中),后面包括PAINT事件將在長時間內得不到執行。由于PAINT事件負責將界面更新,所以這就使用戶界面失去響應。

打一個比方,事件處理線程就像進入某城唯一的單行道一樣,事件相當于汽車。有種PAINT汽車負責為城市運輸非常重要的生活物資。但是有一天,PAINT 前面有一輛汽車突然壞掉了,司機下來修車。但是這車太難修,一修就是幾天,結果后面的PAINT汽車無法前進,物資無法按時運到城里。市民急了,市長雖然不停的打電話催PAINT公司,但即使PAINT公司多添加幾輛車也沒用。由于進城的唯一條路被那輛車給占著,所以再多的PAINT車也只能堵在路上。

不了解Swing的這種事件處理模型的人往往將時間復雜的任務放在處理函數中完成,這是造成Swing應用程序速度很慢的原因。用戶觸發這個動作,用戶界面就失去了響應,于是給用戶的感覺就是Swing太慢了。其實這個錯誤是程序員造成的,并不是Swing的過失。

那么如何避免這個問題,編寫響應速度快的Swing應用程序呢?在SwingWorker的javadoc中有這樣兩條原則:

◆Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive. 耗時任務不要放到事件調度線程上執行,否則程序就會失去響應。

◆Swing components should be accessed on the Event Dispatch Thread only. Swing組件只能在事件調度線程上訪問。

因此處理耗時任務時,首先要啟動一個專門線程,將當前任務交給這個線程處理,而當前處理函數立即返回,繼續處理后面未決的事件。這就像前面塞車的例子似的,那個司機只要簡單的把車開到路邊或者人行道上修理,整個公路系統就會恢復運轉。

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

下面舉一個例子說明這兩點,比如按下查詢按鈕,查詢數據量很大的數據庫,并顯示在一個表中,這個過程需要給用戶一個進度提示,并且能動態顯示表格數據動態增加的過程。假設按鈕的處理函數是myButton_actionPerformed,則:

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

【編輯推薦】

  1. 概述Swing窗體的種類
  2. 淺談Swing線程三種
  3. Swing全屏幕模式
  4. 淺析Swing線程中的LookupEvent
  5. Swing文件選擇器的制作
責任編輯:佚名 來源: 百度空間
相關推薦

2009-07-16 17:09:02

Swing應用程序

2009-07-10 17:24:07

Swing應用程序

2009-07-14 11:08:42

WebRendererSwing應用程序

2009-07-17 16:09:29

Swing桌面應用程序

2009-07-14 18:10:38

Swing應用程序框架

2011-04-15 17:33:39

SWINGAWT

2011-08-03 17:08:43

iPhone Sqlite 時間

2009-08-04 11:46:09

2012-06-07 09:15:14

ibmdw

2012-05-29 10:04:08

2011-08-10 16:57:15

iPhone事件程序包

2011-07-21 10:47:37

iPhone Cocoa 委托

2012-02-15 13:26:56

IndexedDB

2024-04-01 10:07:47

應用程序數據數據庫

2013-11-19 15:35:01

2011-11-03 09:41:35

Android簽名安全性

2009-09-27 17:23:16

Hibernate應用

2009-10-21 09:38:34

VB QuickSor

2013-02-21 14:04:08

Tizenintel

2013-02-21 14:15:41

開發Tizen
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品乱码一二三区的特点 | 在线国产中文字幕 | 韩国精品一区二区三区 | 婷婷成人在线 | 亚洲国产一区二区视频 | 亚洲网站在线观看 | 懂色中文一区二区在线播放 | 成人在线免费视频观看 | 日本在线网址 | 黄色网络在线观看 | 国产美女黄色片 | 国产乱码一二三区精品 | 香蕉超碰| av在线免费网| 成人欧美一区二区三区在线观看 | 欧美日韩在线观看一区 | 精品国产免费一区二区三区五区 | 久久精品免费一区二区 | 精品一区二区三区四区 | 国产视频一区二区 | 欧美日韩不卡在线 | 国产精品一区二区视频 | 免费成人在线网站 | 午夜av影院| 在线观看成人小视频 | 奇米四色在线观看 | 欧美炮房 | 国产精品久久久久久久久久免费看 | 欧美极品视频在线观看 | 91一区二区三区在线观看 | 日韩欧美久久精品 | 99re在线视频观看 | 国产中文字幕在线观看 | 亚洲国产欧美日韩 | 91在线观看免费 | 亚洲天天干 | 国产成人综合av | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 人人澡视频 | www.蜜桃av | 日韩小视频在线 |