Swing GUI的一个简单事项

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

不使用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);
    }
}

2
我猜Swing中的并发可以更好地解释这个东西 :-) - nIcE cOw
下次提问时请使用更好的标题。我曾经有同样的问题,但由于标题不好,没有找到你的问题;-) 这是我的问题:https://dev59.com/_3fZa4cB1Zd3GeqPOjEx - Charmin
1个回答

4

Swing不是线程安全的,也是单线程的。它依赖于事件分发线程(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()

2
据我所知,所有的GUI框架都是一样的,无论你使用.NET/Swing等等,它们都在各自的EDT上运行。对这个信息点赞 :-) - nIcE cOw
@veritas,谢谢您的信息,我会尽力学习有关这些线程的所有知识。 - Martynas Žukovas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接