为什么java不能退出应用程序?

时间:2016-08-27 15:45:53

标签: java swing awt

我有以下问题:我希望java中的swing窗口能够以编程方式显示和关闭。但是,当框架关闭时,我不想退出应用程序,只要其他窗口仍然打开。

据我所知,这是dispose()方法的意图。一旦所有窗口都被处理掉并且没有线程正在运行,应用程序就应该退出。

但是我的问题是我的应用根本没有退出。在进一步调查中,我写了一个MWE,并得到了同样的行为。我几乎100%肯定在很久以前,当我做类似的事情时,它按预期工作。

我是否需要编写自己的窗口管理器?!?这似乎很愚蠢,因为java应该已经拥有这样的功能。据我了解它应该有用的文档...我没有自己开始任何线程,我认为如果点击" X"或按钮。

你能指出我的问题吗?

package optimworkers.gui.config;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Test extends JFrame
{

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Test();
            }
        });
    }

    public Test()
    {
        JButton but = new JButton("Test");
        add(but);
        but.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                setVisible(false);
                dispose();
            }
        });

        pack();
        setVisible(true);

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

}

修改

我使用Ubuntu Linux(Ubuntu 14.04 LTS是正确的)。我尝试使用OpenJDK 1.7.0_101和1.8.0_91(都来自ubuntu存储库)。

我打算将java用于这个特殊项目,因为JVM允许编写可移植代码。因此,如果它不是JRE中的真正错误,我必须/ shouold确保,应用关闭并发出System.exit(0);电话。然而,人们认为这是不好的做法。我试图不惜一切代价避免这样做。

1 个答案:

答案 0 :(得分:-2)

为了处理当前的类(表单)并打开另一个类,您可以使用以下代码。要退出您的应用程序,请使用System.exit(0)

       java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                dispose();
                new YOURCLASSTOBEOPENED().setVisible(true);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(YOURCURRENTCLASS.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });