3

我有一个简单的问题,为什么我需要编写这样的代码

SwingUtilities.invokeLater(new Runnable(){

如果程序没有它创建相同的框架?

带有 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);
    }
}
4

1 回答 1

4

Swing 不是线程安全的,并且是单线程的。它依赖于事件调度线程 (EDT) 来创建、更新和渲染其组件。

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

SwingUtilities.invokeLater并且SwingUtilities.invokeAndWait是基本上将您的 Swing 相关任务放入 EDT 的实用方法。

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

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

此外,大多数 GUI 都是单线程的。摇摆也是如此。因此,尝试从多个线程访问 Swing 会增加应用程序失败的风险。阅读此 http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

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

于 2013-07-16T09:36:54.537 回答