java - Swing:不使用 EDT 创建 GUI 安全吗?

标签 java swing program-entry-point event-dispatch-thread

阅读last paragraph在 Oracle 站点。

Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.

所以main()不应在初始线程内创建 Swing JFrame,而应使用 SwingUtilities.invokeLater() ,至少达到 Java 7。 this Q/A 中也对此进行了解释)。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        createAndShowGUI();
    }
});

虽然这是非常合乎逻辑的,但我们必须观察到,在教程中几乎从未这样做过。 我在其他地方读到现代编译器将插入 invokeLater()在不告诉程序员的情况下调用自己。例如,当使用 Eclipse 时,这是真的吗?

是否有一些引用资料可以证实此行为?是否有不同的情况需要考虑?

最佳答案

我认为这些示例不使用 invokeLater() 因为他们不想使示例复杂化(并且他们不想解释 invokeLater() ,至少在这一点上)。

使用事件分派(dispatch)线程的问题仅适用于已经有 UI 运行的情况;大多数这些示例都是从头开始创建 UI,因此在调用 Swing 内容时它不会运行,并且在屏幕上实现某些内容之前,无需担心用户生成的事件。我想,人们仍然可能会被浇灭,但他们几乎不得不尝试这样做。

所以我想从头开始创建 UI 是它自己的特殊情况。

关于java - Swing:不使用 EDT 创建 GUI 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959139/

相关文章:

java - 如何仅在单击特定 JButton 时才执行某些操作?尝试使用 getSource() 的一些疑问

java - 评估表达式程序在接受用户输入时遇到的问题

java - "Error: Main method not found in class MyClass, please define the main method as..."

java - 使用 main 方法作为启动是否合适?

java - 用newSingleThreadExecutor创建的线程是新创建的线程还是守护线程?

java - 创建 "noname"类实例

java - 使用 while 循环验证 boolean 输入

java - 在 Javassist 中,返回顺序有保证吗?

java - Applet 中的绘图表

java - 无法更改 ActionListener 内的 JButton ActionCommand