繁体   English   中英

Java Swing应用程序不会退出

[英]Java Swing app won't quit

我有一个Java应用程序,它打开一个JFrame并绘制它。 问题是当我尝试退出应用程序时,通过关闭JFrame窗口(在我的Mac或PC上)或从菜单栏(在我的Mac上)选择退出,应用程序就会挂起。 有趣的是,这种行为只有在我将JButton添加到我的应用程序后才出现。 这是我的代码:

public class MyApplicationFrame extends JFrame {

public MyApplicationFrame(MyApplicationLogic l) {
    super();
    this.appLogic = l;
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override public void run() {
                createAndShowGUI();
            }
        });
    }
    catch(InterruptedException e) { }
    catch(InvocationTargetException e) { }

    g = getGraphics();
}

public void paint() { ... }

private void createAndShowGUI() {
    final Container c = getContentPane();
    c.setLayout(new java.awt.FlowLayout());

    final JButton startButton = new JButton("Start");
            // if I comment out these lines with the startButton, everything works
    startButton.addActionListener(new ActionListener() {
        @Override public void actionPerformed(ActionEvent event) {
            appLogic.run();
            c.remove(startButton);
        }
    });
    c.add(startButton);

    setSize(FRAME_SIZE, FRAME_SIZE);
    setVisible(true);
    }
}

在我的应用程序逻辑中,我有以下方法:

public void run() {
    appFrame.paint();
    getNextState();

    // then I added the following code to try and help solve this problem
    System.err.println(java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent());        
}

System.err流上的输出如下所示:

null
null
null
null
null
// here's where I typed command-Q
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0

我在应用程序中没有任何鼠标侦听器(虽然我假设JButton对象有一个)并且我没有在JButton上注册除ActionListener之外的任何侦听器。 而且我没有碰到鼠标。 但我认为所有这些MouseEvent都会阻止应用程序退出。 有人知道我能做些什么吗? 谢谢。

 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

在您的createAndShowGUI()方法中。

告诉JFrame在关闭时退出JVM。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

默认情况下,JFrame在关闭时不执行任何操作。 甚至没有退出JVM。

将以下代码添加到MyApplicationFrame的构造函数中:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我的解决方案是创建一个额外的线程,以便我可以明确地将应用程序逻辑处理与事件处理分开。 我不知道为什么会这样,但似乎已经修复了一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM