为什么我的Java应用程序没有正常关闭?

时间:2016-01-10 21:33:16

标签: java swing applet jvm awt

我有一个java应用程序,可以在JTabbedPane上加载和显示applet。基本上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类中,我有一个管理Applet的arrayList:

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

我循环遍历JPanels的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;
    }
}

但是,每当我关闭applet时,JVM都会继续运行并占用系统资源。我正在使用BootLoader来启动带有参数的JVM:

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

这是我的任务经理在运行几次后最终看起来的样子:

Multiple JVM instances

我显然没有正确关闭我的申请,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

默认情况下,它是WindowConstants.DO_NOTHING_ON_CLOSE