Java JFrame冻结

3

我有一个使用Swing的简单Java应用程序。然而,一旦我执行程序,框架将出现,但我无法在任何地方单击,按钮只会在几秒钟后出现。我非常新于Java的Swing库,所以我可能会错过一些东西,但从我阅读的内容来看,这段代码不应该引起任何问题。

import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.FlowLayout;
import javax.swing.*;

public class Game {

    public static void main(String[] args) {

        JFrame frame = new JFrame("JFrame Example");
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        JLabel label = new JLabel("This is a label!");
        JButton button = new JButton();

        button.setText("Press me");

        panel.add(label);
        panel.add(button);

        frame.add(panel);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

编辑 我重新安装了JDK,但发现以下问题:如果我的浏览器正在运行,当我执行上面的代码时,它会挂起和冻结,但是如果我关闭浏览器,则可以按预期运行。但在我杀死应用程序之前,我不能启动浏览器,因此似乎我的安装有问题,因为这些应该不会使用相同的资源?

编辑 解决了我的问题:我安装了多个版本的JDK和JRE,因此卸载了它们,然后安装了最新版本,一切都正常工作!


Java版本、操作系统、CPU、RAM? - PeterMmm
我正在使用Windows 10上的Java 8,i5-6600k和16GB RAM。然而,我刚刚意识到即使打开“关于Java”的应用程序也会出现同样的延迟,因此我的问题似乎与Java总体相关,而不是与这个特定的代码有关。 - tiggybits
应该像你所做的那样工作。我很好奇你的框架是否真的冻结了,还是只是在窗口调整大小后出现了按钮。 - Antoniossss
1个回答

0

需要在UI调度线程下创建UI:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // code to create UI or call to function that creates the UI
    }
});

Java 8 风格:

SwingUtilities.invokeLater(()->{
    // Your UI code
});

如果您不使用这个习惯用语,那么UI就不能在不一致的状态下部分创建,请参见在swing中创建UI

几乎所有创建或与Swing组件交互的代码都必须在事件分派线程上运行

如果需要阻塞直到UI创建完成,您也可以使用invokeAndWait


是的,它的症状正是它的后果。你有阅读关于此的文档吗?肯定没有。 - Jean-Baptiste Yunès
当然了,我知道Swing是如何工作的。显然你不知道。你有运行他的代码吗?你泛泛而谈。这甚至不是一个不一致的问题...你知道我们为什么要发布到EDT吗?或者你甚至没有深入探讨过这个话题。 - Dioxin
@VinceEmigh 当然可以!这段代码确实可能会失败,就像描述的那样。在Windows上比*nix变体更容易失败,这可能是由于线程管理方式不同造成的。OP的代码有误,他需要进行更正。 - Jean-Baptiste Yunès
是的,它可能会失败。就像文档所指定的那样不一致。这里的结果并不不一致。而且,我在Windows上运行了很多次,也无法复现。你假设OP只运行了一次,然后碰巧不幸遇到了不一致性。你看到了缺少invokeLater,就抓住了它。是的,他的代码不完美,但你的答案是解决方案吗?那能百分之百确定地解决他的问题吗? - Dioxin
按照@Jean-BaptisteYunès的建议操作并没有改变任何事情,我的问题似乎与使用Java有关,因为我注意到任何Java可执行文件在运行时都会出现延迟。 - tiggybits
显示剩余7条评论

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