Swing


          天行健 君子以自強不息

          posts - 69, comments - 215, trackbacks - 0, articles - 16
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          大話swing核心

          Posted on 2008-08-13 22:26 zht 閱讀(1539) 評論(1)  編輯  收藏 所屬分類: Swing
               首先swing是單線程的,這個是這篇文章的前提,也是意義所在,當swing界面程序啟動的時候,會啟動3個進程,
          1、主線程
          2、系統(tǒng)工具包線程:負責捕獲操作系統(tǒng)事件,然后將事件轉(zhuǎn)換成swing的事件,然后發(fā)送到事件派發(fā)線程EDT
          3、事件派發(fā)線程(EDT):將事件派發(fā)到各個組件,并負責調(diào)用繪制方法更新界面

          所有的事件,例如鍵盤,鼠標事件,都會由工具包線程轉(zhuǎn)換成swing事件,然后放到事件隊列EventQueue中,而這個EventQueue的派發(fā)機制是由EDT來管理的。

          所以任何修改組件狀態(tài)的方法都應該在EDT中執(zhí)行,包括構(gòu)造方法。Swing這樣的構(gòu)造原理經(jīng)常會造成的情況就是,在EDT中執(zhí)行長時間的事件,使EDT不能及時響應更新界面的事件,就是所說的界面卡住,這種不光是新手就是比較熟練的程序員也會犯的一個錯誤。所以必須避免在EDT中執(zhí)行長時間的操作,而避免的方法就是多線程,啟動另外的線程來處理冗長的操作,比如操作數(shù)據(jù)庫,讀寫文件等,在這過程中可能要更新界面來給用戶以提示,比如顯示一個進度條,過一段事件更新一下界面,但是在EDT以外的線程中更新界面都是無效的,這在前面已經(jīng)說過,要更新界面就要將對界面的更新操作放到EDT中,但是事件又是在另外的線程中執(zhí)行的,要解決這個問題就要使用SwingUtilities提供的一個方法了 invokeLater,
          public void actionPerformed(ActionEvent e){
              new Thread(new Runnable(){
                      //do something
                      SwingUtilities.invokeLater(new Runnable(){
                          pulic void run(){
                              //update the GUI
                          }    
                  });
              }).start;
          }
          這個方法的作用就是將一個更新界面的任務(wù)放到EDT中,EDT會在適當?shù)臅r候進行調(diào)用以更新界面。invokeLater負責創(chuàng)建一個含有Runnable的特定事件,并讓其在EDT中排隊等待調(diào)用,當被調(diào)用時就會運行Runnable中的run方法進行派發(fā)。

          主站蜘蛛池模板: 饶平县| 潢川县| 临潭县| 广德县| 名山县| 焦作市| 兰西县| 涿州市| 衡阳县| 西乌| 荆州市| 元江| 南城县| 蒲城县| 临江市| 汝州市| 达孜县| 临安市| 潼南县| 扎兰屯市| 集贤县| 永修县| 曲阜市| 淮北市| 江永县| 广丰县| 新和县| 深水埗区| 岑巩县| 来凤县| 睢宁县| 亚东县| 玉环县| 余姚市| 景洪市| 临泉县| 惠来县| 贵德县| 鄂尔多斯市| 甘孜县| 武强县|