<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強不息

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

    大話swing核心

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

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

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

    主站蜘蛛池模板: 亚洲天堂男人天堂| 亚洲国产午夜电影在线入口| 日韩精品无码免费专区午夜 | 女人18毛片水真多免费播放| 色婷婷亚洲一区二区三区| 久久久久国产成人精品亚洲午夜| 国产va在线观看免费| 亚洲av乱码一区二区三区香蕉 | 毛片在线播放免费观看| 亚洲人成77777在线观看网| 国产jizzjizz免费看jizz| 无码中文字幕av免费放dvd| 亚洲av永久中文无码精品综合| 中文字幕亚洲一区二区va在线| 91在线手机精品免费观看| 亚洲av永久无码精品网址| 亚洲嫩草影院久久精品| 波多野结衣视频在线免费观看| 久久国产高潮流白浆免费观看| 羞羞网站免费观看| 亚洲日本国产精华液| 国产午夜亚洲精品理论片不卡| 成人毛片18女人毛片免费96 | 久久亚洲私人国产精品vA | 久久福利资源网站免费看| 一级片在线免费看| 四虎亚洲精品高清在线观看| 亚洲精品老司机在线观看| 99久久免费精品国产72精品九九 | 三年片在线观看免费观看大全中国| 亚洲人成在线观看| 亚洲国产精品自产在线播放| 国产啪精品视频网免费| 久久久久成人片免费观看蜜芽| 日韩在线观看免费完整版视频| 亚洲精品123区在线观看| 亚洲综合在线观看视频| 亚洲成AV人片在线观看无| 永久免费bbbbbb视频| 大学生一级毛片免费看| 最近高清中文字幕免费|