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