【问题标题】:Why is my Java application not closing properly?为什么我的 Java 应用程序没有正确关闭?
【发布时间】:2016-04-15 03:25:22
【问题描述】:

我有一个 Java 应用程序,它在 JTabbedPane 上加载和显示一个小程序。所以基本上 GUI 是:

Applet --> JPanel(AppletStub) --> JPanel --> JTabbedPane --> JFrame

我已经把这条标准线放在了 JFrame 类中:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

这是我在 JFrame 类中应该在窗口关闭时调用的方法:

    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            setVisible(false);
            tabbedPane.stopAllApplets();
            dispose();
            super.windowClosed(e);
        }
    });

然后,在我的 Tabbed Pane 类中,我有一个 arrayList 来管理 Applet:

ArrayList<PanelHolder> games = new ArrayList<>();

我像这样遍历 JPanel 的 ArrayList:

public void stopAllApplets(){
    for (int i = 0; i < games.size(); i++) {
        games.get(i).stopGame();
    }
}

JPanel 类中的 stopGame() 方法非常简单:

public void stopGame(){
    game.stop();
}

那么在实现 AppletStub 的 JPanel 类中,这里是 stop() 方法:

public void stop() {
    if (applet != null) {
        applet.stop();
        applet.destroy();
        applet = null;
    }
}

但是,每当我关闭小程序时,JVM 都会继续运行并占用系统资源。我正在使用 BootLoader,它使用参数启动 JVM:

javaw -Xbootclasspath/p:"/C:/Users/Username/Documents/NetBeansProjects/Game/build/classes/" -cp "." main.Main

这是我运行几次后我的任务管理器最终的样子:

我显然没有正确关闭我的应用程序,有什么建议吗?

【问题讨论】:

  • JVM不退出的唯一原因是有一个非守护线程还在运行
  • @MadProgrammer 是有道理的。我去看看,谢谢!
  • 如需尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。小程序是谁写的?你还是其他人?似乎小程序正在创建非守护线程(但这只是猜测)。

标签: java swing applet jvm awt


【解决方案1】:

将此添加到您的框架代码中:

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

默认为 WindowConstants.DO_NOTHING_ON_CLOSE

【讨论】:

  • 对不起,没有提到我已经有了。我相应地编辑了我的问题。
  • 您是否尝试过调试关闭应用程序并查看哪个线程仍在运行(必须是一些非恶魔)。这可能会影响它为什么没有关闭。
  • 有道理,我试试
  • 原来这是一个简单的问题。愚蠢的是我在这上面浪费了 2 个小时。不过谢谢!
  • 通常是这样的。祝你工作顺利;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多