2013-07-16 86 views
3

我有一個簡單的問題,爲什麼我需要Swing GUI的一個簡單的事情

SwingUtilities.invokeLater(new Runnable(){ 

寫這樣的代碼如果PROGRAMM沒有它創建相同的幀?

代碼SwingUtilities的

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class App { 
    public static void main (String args[]){  
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JFrame frame = new JFrame("Hello world swing"); 
       frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(300, 400);   
      } 
     }); 
    } 
} 

代碼而不蕩工具。

import javax.swing.JFrame; 

public class App { 
    public static void main (String args[]){  
     JFrame frame = new JFrame("Hello world swing"); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 400); 
    } 
} 
+2

我猜[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),可以用更好的方式解釋這件事:-) –

+0

下一次使用更好的標題爲你的問題。我有同樣的問題,但沒有找到你的問題,因爲不好的標題;-) 這是我的問題:http://stackoverflow.com/questions/18976990/best-practice-to-start-a-swing -application – Charmin

回答

4

Swing不是線程安全的,並且是單線程的。它依賴於事件調度線程(EDT)來創建,更新和渲染其組件。

http://en.wikipedia.org/wiki/Event_dispatching_thread

SwingUtilities.invokeLaterSwingUtilities.invokeAndWait是實用方法 基本上把你的揮杆相關的任務到EDT。

如果您不這樣做,最終可能會失敗。隨着應用程序變大,您會看到奇怪的結果。

始終在EDT上執行GUI(SWING)相關操作。

另外大多數GUI是單線程的。 Swing也是如此。因此,嘗試從多個線程訪問Swing會增加應用程序失敗的風險。 閱讀本 http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

在代碼中,一個旋轉的操作(創建JFrame的)正在對主線程,這是不建議做。使用SwingUtilities.invokeLater()

+2

據我所知,對於所有'GUI Frameworks'來說,無論你使用.NET/Swing,它們都運行在它們各自的'EDT'上。 +1信息:-) –

+0

@nIcEcOw +1。是的。我更新了我的回答 – veritas

+0

@veritas謝謝你的信息,我會盡力學習有關這些線程的一切。 –