递归导致退出以退出所有JFrame(终止应用程序)

时间:2010-03-06 20:25:42

标签: java swing recursion terminate

我创建了一个应用程序,让用户可以选择完全打开应用程序的新生成。当用户这样做并关闭应用程序时,整个应用程序终止;不只是窗户。

我应该如何递归地生成一个应用程序,然后当用户退出JFrame spawn时;只杀死那个JFrame而不是整个实例?

以下是相关代码:

[...]
JMenuItem newMenuItem = new JMenuItem ("New");
newMenuItem.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
{        
    new MainWindow();
    }
});
fileMenu.add(newMenuItem);

[....]

JMenuItem exit = new JMenuItem("Exit");
exit.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
});
fileMenu.add(exit);
[...]

2 个答案:

答案 0 :(得分:3)

首先,您应该尝试JFrame.DISPOSE_ON_CLOSE而不是JFrame.EXIT_ON_CLOSE,因为无论是否有活动线程运行,EXIT_ON_CLOSE都会关闭应用程序。 如果仍有问题,应考虑引入实例计数器。更聪明地做出反应 另见discussion

答案 1 :(得分:0)

我完全删除了frame.setDefaultCloserOperation(JFrame.EXIT_ON_CLOSE);代码。

我将其更改为DISPOSE_ON_CLOSE,问题仍然存在。我最终创建了一个windowEvent并添加:frame.dispose();,行为就是我想要的。

以下是代码:

                frame.addWindowListener(new WindowListener() {
                public void windowClosing(WindowEvent e) {
                    //Allows for multiple instances and properly closing
                    //only one of the Frames instead of all of them
                    frame.dispose();
                }
                public void windowOpened(WindowEvent e) {}              
                public void windowClosed(WindowEvent e) {}
                public void windowIconified(WindowEvent e) {}
                public void windowDeiconified(WindowEvent e) {}
                public void windowActivated(WindowEvent e) {}
                public void windowDeactivated(WindowEvent e) {}
            });