JFrame.dispose不关闭框架

时间:2016-01-14 02:17:35

标签: java intellij-idea jframe launch4j

在某些情况下,我的程序不会关闭指定的帧。出于某种原因,当使用run命令运行IntelliJ时,它会很好地关闭,但是在编译成jar并用Launch4J包装后,当我尝试以编程方式关闭它时它会卡住。以下是适用的代码:

Classic.java

import javax.swing.*;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.*;
import java.text.SimpleDateFormat;
import static javax.swing.SwingUtilities.invokeLater;
public class Classic extends Game{
    private static JFrame gui;
...
    //Starts game and opens gui
    public void play() {
        invokeLater(Classic::startGUI);
        //startGUI() intiates gui correctly, let me know if you need it
        new Thread(Classic::startGame).start();
    }
...
    public static void startGame() {
        //Program works fine until closing window;
        //Game methods and code omitted
        print("Thank you for playing!" + System.lineSeparator() + "Press enter to exit.");
        boolean end = false;
        while (!end) {
            //isInputReady() checks if user pressed enter
            end = newContentPane.isInputReady();
        }
        gui.dispose();
    }
}

我不确定这是代码错误还是Launch4J的错误,因为这只发生在Launch4J编译版本中(不是通过IntelliJ或通过java.exe -jar)。

编辑:我也尝试使用thread.interrupt()杀死GUI线程,但这并没有改变结果。

1 个答案:

答案 0 :(得分:0)

您可以尝试gui.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);(在实例化gui对象后设置此选项)

通常,每个非deamon线程到达结束后JVM都会关闭。 Swing创建自己的线程来处理事件(EDT)。我假设在您的应用程序中,在某些情况下仍然会运行非deamon线程,这会阻止JVM关闭。

您可以在此主题中找到更多信息:JFrame.dispose() vs System.exit()