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

詳解SwingWorker與Swing程序

開發(fā) 后端
本文介紹SwingWorker與Swing程序,SwingWorker是抽象類,因此必須繼承它才能執(zhí)行所需的特定任務(wù)。注意該類有兩個類型參數(shù):T及V。

某些人一拍腦袋的事,讓我有機會跟Swing干上了,因為項目組沒人用這玩意整過這東西,那就只能我硬著頭皮上了!有時候人是要有點壓力才行的。
 
***階段的開發(fā):
準備階段:工具的選擇。用了Netbeans 6,試用了下,感覺畫界面還比較容易,但是生成的代碼很長,剛開始對Swing很陌生 ,看著netbeans 生成代碼很頭痛,感覺不是我想要的東西,然后放棄了。然后是VE,因為也只是倒騰了下,沒細看。***選擇了Jigloo ,但是用了之后才知道他生成的代碼也很惡劣......

開發(fā)階段:別熟悉swing 邊開發(fā),其中遇到亂七八遭事情一堆,但是因為這個軟件的功能是比較簡單的,***終于是拿了出來,雖然BUG一堆,但是也算是我的***swing作品,客戶感覺效果很不理想(有軟件設(shè)計方面的,也有技術(shù)運用方面的),也就有了下面繼續(xù)開發(fā)的經(jīng)歷了。
 主要技術(shù)方面問題是,線程的亂用造成死鎖,經(jīng)常造成莫名的假死。

第二階段的開發(fā):
因為***階段的開發(fā)比較痛苦,所以決定換個語言開發(fā)。因為最近RIA比較熱,RIA里面的adoble的air也算比較熱門的,UI給人感覺很華麗,也自己嘗試做過一些DEMO。項目中用的webservice,加密解密操作,文件上傳下載都有解決的辦法,但是要命的是這個項目中要調(diào)用外部程序,air在這方面比較脆弱,google了一把 as 的 fscommand 能調(diào)用其他程序,但是 air 竟然不支持這個,后來還是塌塌實實用SWING 吧。
然后又試用了一把VE,感覺現(xiàn)在比上次我用的時候好多了,后來就把Jigloo換 VE了。

擺在眼前的就是如何運用好線程了。又google了一把,找到了swingworker 這個東西拉。從Java SE 6開始引進的SwingWorker能幫你輕松的編寫多線程Swing程序,改善你Swing程序的結(jié)構(gòu),提高界面響應(yīng)的靈活性,這正是我要的東西。
一個Swing程序中一般有下面三種類型的線程:
◆初始化線程(Initial Thread)
◆UI事件調(diào)度線程(EDT)
◆任務(wù)線程(Worker Thread)

Swing程序只有一個用EDT,該線程負責(zé)GUI組件的繪制和更新,通過調(diào)用程序的事件處理器來響應(yīng)用戶交互。所有事件處理都是在EDT上進行的,程序同UI組件和其基本數(shù)據(jù)模型的交互只允許在EDT上進行,所有運行在EDT上的任務(wù)應(yīng)該盡快完成,以便UI能及時響應(yīng)用戶輸入。

Swing編程時應(yīng)該注意以下幾點:
1.從其他線程訪問UI組件及其事件處理器會導(dǎo)致界面更新和繪制錯誤。
2.在EDT上執(zhí)行耗時任務(wù)會使程序失去響應(yīng),這會使GUI事件阻塞在隊列中得不到處理。
3.應(yīng)使用獨立的任務(wù)線程來執(zhí)行耗時計算或輸入輸出密集型任務(wù),比如同數(shù)據(jù)庫通信、訪問網(wǎng)站資源、讀寫大樹據(jù)量的文件。
而我***階段開發(fā)的正是由于沒有注意到這點導(dǎo)致整個程序效果不佳。程序中有個事件處理都要訪問Web服務(wù),這些服務(wù)通常要許多秒后才能響應(yīng),在此期間,如果程序在EDT上進行Web服務(wù)交互,用戶就不能取消搜索或者同界面交互,像這兩種都不應(yīng)該在EDT上運行。

程序訪Web服務(wù)的IO操作時間
允許EDT繼續(xù)執(zhí)行后續(xù)的UI事件 

顯示了在A和B點之間,EDT不能處理UI事件,AB兩點之間代表了程序訪Web服務(wù)的IO操作時間:
javax.swing.SwingWorker類是Java SE 6中新出現(xiàn)的類,使用SwingWorker,程序能啟動一個任務(wù)線程來異步查詢,并馬上返回EDT線程。顯示了使用SwingWorker后,事件處理立即返回,允許EDT繼續(xù)執(zhí)行后續(xù)的UI事件。原先就是都放在EDT上了,效果勉強也就難免了。而使用Swingworker啟動一個任務(wù)線程就可以靈活響應(yīng)界面。

下面講講他的用法:
SwingWorker的定義如下:public abstract class SwingWorker extends Object implements RunnableFuture

SwingWorker是抽象類,因此必須繼承它才能執(zhí)行所需的特定任務(wù)。注意該類有兩個類型參數(shù):T及V。T是doInBackground和get方法的返回類型,V是publish和process方法要處理的數(shù)據(jù)類型。

SwingWorker實現(xiàn)以下接口方法:
◆boolean cancel(boolean mayInterruptIfRunning)
◆T get()
◆T get(long timeout, TimeUnit unit)
◆boolean isCancelled()
◆boolean isDone()

SwingWorker實現(xiàn)了所有的接口方法,實際上你僅需要實現(xiàn)以下SwingWorker的抽象方法:protected T doInBackground() throws Exception

doInBackground方法作為任務(wù)線程的一部分執(zhí)行,它負責(zé)完成線程的基本任務(wù),并以返回值來作為線程的執(zhí)行結(jié)果。繼承類須覆蓋該方法并確保包含或代理任務(wù)線程的基本任務(wù)。不要直接調(diào)用該方法,應(yīng)使用任務(wù)對象的execute方法來調(diào)度執(zhí)行。

在獲得執(zhí)行結(jié)果后應(yīng)使用SwingWorker 的get方法獲取doInBackground方法的結(jié)果??梢栽贓DT上調(diào)用get方法,但該方法將一直處于阻塞狀態(tài),直到任務(wù)線程完成。***只有在知道結(jié)果時才調(diào)用get方法,這樣用戶便不用等待。為防止阻塞,可以使用isDone方法來檢驗doInBackground是否完成。另外調(diào)用方法 get(long timeout, TimeUnit unit)將會一直阻塞直到任務(wù)線程結(jié)束或超時。獲取任務(wù)結(jié)果的***地方是在done方法內(nèi):protected void done()

在doInBackground方法完成之后,SwingWorker調(diào)用done方法。如果任務(wù)需要在完成后使用線程結(jié)果更新GUI組件或者做些清理工作,可覆蓋done方法來完成它們。這兒是調(diào)用get方法的***地方,因為此時已知道線程任務(wù)完成了,SwingWorker在EDT上激活done方法,因此可以在此方法內(nèi)安全地和任何GUI組件交互。

沒必要等到線程完成就可以獲得中間結(jié)果。中間結(jié)果是任務(wù)線程在產(chǎn)生***結(jié)果之前就能產(chǎn)生的數(shù)據(jù)。當(dāng)任務(wù)線程執(zhí)行時,它可以發(fā)布類型為V的中間結(jié)果,覆蓋process方法來處理中間結(jié)果。后文還將提供這些方法的更多詳細信息。當(dāng)屬性改變時,SwingWorker實例能通知處理器,SwingWorker有兩個重要的屬性:狀態(tài)和進程。任務(wù)線程有幾種狀態(tài),以下面SwingWorker.StateValue枚舉值來表示:
◆PENDING
◆STARTED
◆DONE

任務(wù)線程一創(chuàng)建就處于PENDING狀態(tài),當(dāng)doInBackground方法開始時,任務(wù)線程就進入STARTED狀態(tài),當(dāng)doInBackground方法完成后,任務(wù)線程就處于DONE狀態(tài),隨著線程進入各個階段,SwingWorker超類自動設(shè)置這些狀態(tài)值。你可以添加處理器,當(dāng)這些屬性發(fā)生變化來接收通知。

***,任務(wù)對象有一個進度屬性,隨著任務(wù)進展時,可以將這個屬性從0更新到100標識任務(wù)進度,當(dāng)該屬性發(fā)生變化時,任務(wù)通知處理器進行處理。

我的使用感覺就是,象I/O操作,數(shù)據(jù)操作,網(wǎng)絡(luò)操作等耗時的操作放到 doInBackground()中處理,任務(wù)執(zhí)行中而非任務(wù)結(jié)束時發(fā)布數(shù)據(jù),要調(diào)用publish方法.
publish方法時,SwingWorker類調(diào)度process方法。有意思的是process方法是在EDT上面執(zhí)行,這意味著可以同Swing組件和其模型直接交互??梢詫崿F(xiàn)你在處理任務(wù)時,給個進度條提示。

【編輯推薦】

  1. 概述Swing核心組件
  2. 淺談NetBeans開發(fā)Swing
  3. Swing模式就是走RepaintManager的方式
  4. 淺析Swing Image的轉(zhuǎn)換
  5. 介紹AWT和Swing組件
責(zé)任編輯:佚名 來源: Jython中文網(wǎng)
相關(guān)推薦

2009-07-10 16:14:29

MVC設(shè)計模式Swing

2009-07-17 17:47:39

SwingWorker

2009-07-14 15:34:22

Swing中的線程GUI程序

2009-07-14 11:08:42

WebRendererSwing應(yīng)用程序

2009-07-17 17:34:03

SwingWorker異常處理

2009-07-17 10:58:12

SwingWorker

2009-07-10 09:30:41

SwingWorker

2009-07-15 15:35:59

Swing程序Swing性能

2009-07-10 09:05:20

SwingWorker

2009-07-17 17:41:41

SwingWorker

2011-04-15 17:33:39

SWINGAWT

2009-07-10 12:30:12

Swing組件

2009-07-09 11:55:17

Swing模型過濾

2009-07-16 17:09:02

Swing應(yīng)用程序

2009-07-17 16:19:16

Swing核心組件

2009-07-17 10:42:06

Swing應(yīng)用程序處理函數(shù)

2009-07-14 16:07:59

調(diào)用JavaFX代碼Swing程序

2009-07-15 10:52:13

JTree組件

2009-07-10 17:24:07

Swing應(yīng)用程序

2009-07-14 16:30:41

Swing與SWT
點贊
收藏

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

主站蜘蛛池模板: 国产综合久久久久久鬼色 | 成人av一区二区三区 | 在线中文字幕亚洲 | 亚洲美女在线视频 | 国产一区二区三区高清 | 欧美成人综合 | 91精品国产91久久久久久丝袜 | 国产精品国产三级国产aⅴ无密码 | 亚洲欧美国产精品久久 | 男人的天堂在线视频 | 日韩精品成人网 | 亚洲成人动漫在线观看 | 国产一区二区三区视频 | 五月天婷婷综合 | 九九精品影院 | 亚洲综合精品 | av第一页 | 日本在线免费看最新的电影 | 久久69精品久久久久久久电影好 | 久久黄色 | 欧美色视频免费 | 欧美午夜一区二区三区免费大片 | 久久蜜桃资源一区二区老牛 | 日本精品一区二区三区在线观看视频 | 97人澡人人添人人爽欧美 | 欧美亚洲一区二区三区 | 超碰成人av | 亚洲国产精品99久久久久久久久 | 怡红院免费的全部视频 | 天天操夜夜看 | 91视频精选 | 99精品国产一区二区三区 | av黄色片在线观看 | 国产精品av久久久久久久久久 | 国产 91 视频 | xxx国产精品视频 | 国产传媒在线观看 | 草樱av| 欧美一区二区久久 | 久久久精品 | 久久国产日韩欧美 |