Swing GUI是一件简单的事情

时间:2013-07-16 09:31:54

标签: java swing user-interface swingutilities

我有一个简单的问题,为什么我需要使用

编写这样的代码
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);        
            }
        });
    }
}

没有swing实用程序的代码。

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);
    }
}

1 个答案:

答案 0 :(得分:4)

Swing不是线程安全的,并且是单线程的。它依赖于Event Dispatch Thread(EDT)来创建,更新和呈现其组件。

请参阅http://en.wikipedia.org/wiki/Event_dispatching_thread

SwingUtilities.invokeLaterSwingUtilities.invokeAndWait是实用程序方法 基本上将你的Swing相关任务放入EDT。

如果你不这样做,最终可能会失败。随着您的应用程序变得更大,您将看到奇怪的结果。

始终在EDT上执行GUI(SWING)相关操作。

大多数GUI也是单线程的。 Swing也是如此。因此,努力 访问来自多个线程的Swing将增加应用程序失败的风险。 读这个 http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

在您的代码中,正在主线程上执行Swing操作(创建JFrame),这是不推荐的。使用SwingUtilities.invokeLater()