Board logo

標題: 关于javax.swing.SwingUtilities.invokeLater()的疑惑 [列印本頁]

作者: krave    時間: 2014-12-18 01:01     標題: 关于javax.swing.SwingUtilities.invokeLater()的疑惑

老师,您好。
有个问题想请教一下,当学习JDK7学习笔记的时候,到Swing这一章的地方,
有看到如下代码:
public static void main(String[] args){
    javax.swing.SwingUtilities.invokeLater(new Runnable(){
        @Override
        public void run(){
             new JNotePad().setVisible(true);
        }
    });
}
知道这边是产生实例并设可见性为true。
但是为什么这边需要用到invokeLater()函数呢?
有了解到invokeLater()函数是将run()方法排入事件队列,但是为什么Swing中要做排入事件队列的操作呢?
麻烦老师指教,谢谢
作者: caterpillar    時間: 2014-12-18 16:23

書後面有寫…「視窗上發生任何事情(鍵盤操作、滑鼠點選、大小改變等),都會產生事件(Event),若對某些事件有興趣,可以對元件註冊傾聽器(Listener),之後會談到視窗元件事件處理,目前你要先知道的是,每個視窗程式都會有個
事件佇列(Event queue),若有事件發生都會被排入這個佇列,視窗程式會使用一條執行緒來處理佇列中的事件、呼叫已註冊傾聽器中的方法。
Swing元件並非執行緒安全,為了避免在事件佇列處理執行緒外有更新Swing元件的其他執行緒,建議更新Swing元件的動作應排入事件佇列中,讓事件佇列處理執行緒循序處理,避免多個執行緒同時存取Swing元件而造成競速問題。javax.swing.SwingUtilities的invokeLater()方法,可將指定的Runnable實作物件排入事件佇列,因此事件佇列處理執行緒將會呼叫排定的JNotePad實例建立與setVisible()呼叫動作,setVisible()設定為true可顯示視窗,設為false則隱藏視窗。」

https://www.google.com.tw/webhp? ... swing%20invokelater
作者: krave    時間: 2014-12-19 02:53

書後面有寫…「視窗上發生任何事情(鍵盤操作、滑鼠點選、大小改變等),都會產生事件(Event),若對某些 ...
caterpillar 發表於 2014-12-18 16:23


啊~ 了解了 谢谢老师 第一遍看的时候不是很理解。




歡迎光臨 CodeData 技術論譠 (http://www.codedata.com.tw/forum/) Powered by Discuz! 7.2