2015-11-05 22 views
0

我在撥打JOptionPane.showMessageDialog時遇到了問題,爲什麼這個調用沒有在Event-Dispatch-Thread上完成。解決方法是執行它的EDT,以這樣的方式爲什麼調用JOptionPane不會自動在EDT上完成?

if(!SwingUtilities.isEventDispatchThread()){ 
    try{ 
    SwingUtilities.invokeAndWait(new Runnable(){ 
     public void run(){ 
     JOptionPane.showMessageDialog(...); 
     } 
    }); 
    }catch(...){...} 
}else{ 
    JOptionPane.showMessageDialog(...); 
} 

,在這裏我的問題....這是爲什麼檢查不通過的JOptionPane類的每個方法自動完成?

+1

整個Swing API以這種方式工作。爲什麼?可能是爲了速度和性能。 Swing API只是假設你會做正確的事情或承受後果。有很多方法可以解決這個問題,例如使用定製的重繪管理器來檢測EDT上發生的操作,這些操作在開發中使用,但這並不能保證它能捕獲所有違規。例如SWT和JavaFX如果違反了單線程規則,會主動拋出異常,但是它們具有設計好處,當硬件稍微強大一些時,性能影響並不如此大;) – MadProgrammer

回答

0

我不認爲這在每種情況下都是必要的。雖然我們知道擺動通常不是線程安全的,但它是線程安全的,而訪問是本地化的創建擺動組件的方法,並且在它顯示在屏幕上之前,將其暴露給UI線程

+0

*「t是線程安全,而訪問是本地化的創建擺動組件的方法,並在它顯示在屏幕上之前「* - 這實際上並沒有保證。一個或多個組件可能會在初始化過程中生成可能影響其他組件的事件。作爲一般的大拇指,在EDT上創建和修改,它只是更安全或圓滑 – MadProgrammer

+0

因此,在這裏我們談論的情況下,你是否說調用JOptionPane.showXXXDialog(...)可能會遇到線程問題?我真的不知道在這種情況下會發生什麼。 – ControlAltDel

+0

鑑於API不僅可以創建對話框,而且還可以創建標籤,面板和按鈕,但如果傳入更復雜的對象(自定義組件),仍然有可能,那麼您會遇到更大的可能性。事實是,它「可能」發生,更糟的是,它可能在不同平臺上發生不同。事實上,組件在顯示之前有可能生成事件,這可能會影響其他組件。 – MadProgrammer

相關問題