Почему мое приложение зависает при отображении JOptionPane поверх JFrame? - PullRequest
2 голосов
/ 31 марта 2011

Я написал приложение в окне 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;
    }
}

Кто-нибудь знает, почему он это делает?

Ответы [ 3 ]

8 голосов
/ 18 декабря 2011
private void ShowMessage(String message) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, message);
        }
    });
}
1 голос
/ 01 апреля 2011

Попробуйте пропустить кадр вместо нуля

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

И не смешивайте awt и swing (JFrame и Canvas) вместе

0 голосов
/ 30 декабря 2016

Это потому, что вы передали true в setAlwaysOnTop JFrame. Попробуйте передать false. setAlwaysOnTop(false);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...