【问题标题】:Why does my application freeze when displaying a JOptionPane on top of a JFrame?为什么在 JFrame 上显示 JOptionPane 时我的应用程序会冻结?
【发布时间】:2016-12-31 00:40:32
【问题描述】:

我在 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;
    }
}

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

【问题讨论】:

  • 你在你的应用中使用并发吗?您可以只留下new JFrame(...), setVisible, showMessageDialog 来测试您的代码,然后看看它是否有效?
  • @pajton:行得通。嗯..让我们看看如果我一个一个启用一切会发生什么
  • 嗯,这只是调试问题的技巧:现在您可以开始逐段添加代码,看看是哪段代码导致了问题。
  • @pajton:问题原来是 JFrame 中的 openGL 上下文。我已经尝试了很长时间,但是没有办法让错误消息与框架同时出现,同时保持响应。我可能必须找到某种解决方法,但无论如何感谢您的帮助!
  • 很高兴您找到了导致问题的原因!不过,如果您需要帮助,您可以发布另一个更详细的问题:)。

标签: java swing


【解决方案1】:
private void ShowMessage(String message) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, message);
        }
    });
}

【讨论】:

  • 我们的救生员。没有这个,我们的应用程序完全冻结,我不知道为什么。谢谢!
【解决方案2】:

尝试在那里传递框架而不是 null

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

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

【讨论】:

    【解决方案3】:

    那是因为您已将 true 传递给 JFrame 的 setAlwaysOnTop。请尝试传递 false。 setAlwaysOnTop(false);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      相关资源
      最近更新 更多