Java 为什么我的应用程序在JFrame顶部显示JOptionPane时会冻结?

Java 为什么我的应用程序在JFrame顶部显示JOptionPane时会冻结?,java,swing,Java,Swing,我已经在JFrame窗口中编写了一个应用程序,如果需要,我希望弹出一条错误消息。但是,当我调用“JOptionPane.showMessageDialog()”时,应用程序会冻结,停止它的唯一方法是使用任务管理器。 以下是我的代码的精简版本: import java.awt.Canvas; import java.awt.Dimension; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;

我已经在JFrame窗口中编写了一个应用程序,如果需要,我希望弹出一条错误消息。但是,当我调用“JOptionPane.showMessageDialog()”时,应用程序会冻结,停止它的唯一方法是使用任务管理器。 以下是我的代码的精简版本:

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.concurrent.atomic.AtomicReference;
import javax.swing.JFrame;

public class GameMain {
    public JFrame jframe;
    public Canvas canvas;

    private AtomicReference<Dimension> canvasSize = new AtomicReference<Dimension>();

    public void initialize(int width, int height) {
    try {
        Canvas canvas = new Canvas();
        JFrame frame = new JFrame("testapp");
        this.canvas = canvas;
        this.jframe = frame;
        ComponentAdapter adapter = new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                resize();
            }
        };

        canvas.addComponentListener(adapter);
        canvas.setIgnoreRepaint(true);
        frame.setSize(640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(canvas);
        frame.setVisible(true);
        Dimension dim = this.canvas.getSize();
        } catch (LWJGLException le) {
            le.printStackTrace();
        }

        JOptionPane.showMessageDialog(null, "oops!");
    }
    public void resize()
    {
        Dimension dim = this.canvas.getSize();
        canvasSize.set(dim);
        dim = null;
    }
}
导入java.awt.Canvas;
导入java.awt.Dimension;
导入java.awt.event.ComponentAdapter;
导入java.awt.event.ComponentEvent;
导入java.util.concurrent.AtomicReference;
导入javax.swing.JFrame;
公共类游戏主机{
公共JFrame;
公共画布;
私有AtomicReference canvasSize=新的AtomicReference();
公共空白初始化(整型宽度、整型高度){
试一试{
画布=新画布();
JFrame=新JFrame(“testapp”);
this.canvas=画布;
this.jframe=frame;
ComponentAdapter=新的ComponentAdapter(){
公共无效组件已恢复(组件事件e){
调整大小();
}
};
addComponentListener(适配器);
canvas.setIgnoreRepaint(true);
帧设置大小(640480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(画布);
frame.setVisible(true);
Dimension dim=this.canvas.getSize();
}捕获(LWJGLEXE){
le.printStackTrace();
}
showMessageDialog(null,“oops!”);
}
public void resize()
{
Dimension dim=this.canvas.getSize();
画布尺寸。设置(暗);
dim=null;
}
}

有人知道它为什么会这样做吗?

尝试传递帧,而不是传递空帧

JOptionPane.showMessageDialog(null, "oops!");

不要将awt和swing(JFrame和Canvas)混合在一起

这是因为您始终在JFrame顶部将true传递给Set。请尝试传递false。
setAlwaysOnTop(假)

您是否在应用程序中使用并发?你可以只留下
newjframe(…)、setVisible、showMessageDialog来测试你的代码吗?然后看看它是否有效?@pajton:那就行了。陛下让我们看看如果我一个接一个地启用所有内容会发生什么好吧,这只是调试问题的技巧:现在您可以开始逐段添加代码,看看是哪段代码导致了问题。@pajton:问题原来是JFrame中的openGL上下文。我已经尝试了很长一段时间,但是没有办法让错误消息与帧同时出现,同时保持响应。我可能需要找到某种解决办法,但还是要谢谢你的帮助!很好,你找到了问题的原因!不过,如果你需要帮助,你可以发布另一个更详细的问题:)。这是我们的救命稻草。没有这个,我们的应用程序完全冻结了,我不知道为什么。谢谢
private void ShowMessage(String message) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, message);
        }
    });
}