程序仍在System.exit之后运行

时间:2013-11-21 15:52:04

标签: java swing

我在这里有点绝望。我有这个jFrame,我需要在按Escape后关闭。这可以通过使用keyTyped事件轻松完成。在keyTyped事件中,我尝试使用关闭窗口的System.exit,但是进程仍然在任务管理器中运行(并且在netbeans中,即使我从jar文件运行,它仍然在任务管理器中运行)

我尝试过dispose,setVisible(false)以及其他东西,但似乎没什么用。

编辑:

代码

public Sketch(int width, int height)
{
    sketch = new JFrame();
    area = new JLabel();

    sketch.setUndecorated(true);
    sketch.setMinimumSize(new Dimension(width, height));
    sketch.setSize(width, height);
    area.setBounds(0, 0, width, height);

    sketch.getContentPane().setLayout(null);
    sketch.getContentPane().add(area);
    sketch.pack();

    sketch.setLocationRelativeTo(null);
    sketch.setVisible(true);
    sketch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    imageBGR = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
    imageGRAY = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);

    keyEvents();
    setup();

    Thread t = new Thread()
    {
        @Override
        public void run()
        {
            running=true;
            while(running)
                draw();
        }
    };
    t.start();
}

    private void keyEvents()
{
    sketch.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e)
    {
        if(e.getKeyChar()==KeyEvent.VK_ESCAPE)
        {
            running=false;
            System.exit(0);
        }
    }
    });
}

注意:设置功能是一个空白函数,在扩展此类时我会覆盖它。

EDIT2:已解决

我发现了我做错了什么。看来我在课堂上扩展了这个,我正在使用网络摄像头。当我调用System.exit函数时,网络摄像头已关闭,所以我认为我不需要正确释放它,但事实上它是需要的。

2 个答案:

答案 0 :(得分:5)

关闭框架时的默认行为不是退出程序,而是关闭窗口。要退出程序,您必须执行以下操作:

jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

你也可以这样做:

jFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
             System.exit(0);
         }
     });

答案 1 :(得分:3)

您的running变量需要声明volatile,并且您需要在关闭前的某个时刻将其设置为false。

话虽如此,这段代码看起来既危险又坏:

Thread t = new Thread()
{
    @Override
    public void run()
    {
        running=true;
        while(running)
            draw();
    }
};
t.start();

你内部没有Thread.sleep(...),所以它有可能占用CPU,而且看起来你正试图修改Swing事件线程的Swing状态,你就有间歇性线程的危险失败。这告诉我你想要使用Swing Timer。


请注意,要获得更完整的帮助,请考虑发布一个演示问题的最小代码示例SSCCE。这将允许我们运行您的代码并对其进行修改,甚至可能更正它。请在回复前阅读链接,因为它提供了有关SSCCE要求的许多重要细节。