2013-07-16 46 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谢谢你的信息,我会尽力学习有关这些线程的一切。 –