java - Swing GUI 一件简单的事情

标签 java swing user-interface swingutilities

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

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

最佳答案

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()

关于java - Swing GUI 一件简单的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17672886/

相关文章:

java - 如何在java中使用哈希函数对密码进行哈希处理?

java - Android MediaPlayer 在同时播放两种声音时有时会跳过或失败

java - "Cannot be resolved to type"错误

java - GridBagLayout 顶部和底部调整间隙

java - 如何将按钮和 Canvas 放入jframe中? ( java Swing )

java - Android - 多个 View 或运行时 fragment 替换​​?

java - java中多个表数据导出到同一个excel工作表的多个工作表

java - Java 中的自定义 JMenuItems

javascript - 我将如何使用 jquery click 从导航栏中的元素淡出 html 中的旁白部分?

c - 如果我尝试从 Channel 调用字符串数据,则会出现错误结果