2013-11-21 121 views
2

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

我试过配置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); 
     } 
    } 
    }); 
} 

注:设定功能是扩展该类时我重写一个空白的功能。

编辑2:已解决

我发现我做错了什么。看起来,在我扩展了这个课程的课上,我使用了网络摄像头。当我调用System.exit功能时,摄像头指示灯熄灭,所以我认为我不需要正确释放它,但实际上它是需要的。

+0

你有任何进程仍在运行?一个摆动计时器,也许? –

+0

是小到足以发布的代码? –

+0

用我的代码更新。我有一个进程正在运行,但我确保它关闭。我在网上搜索了2个多小时,仍然找不到任何有效的工具。 –

回答

5

关闭帧时的默认行为不是退出程序,而是关闭窗口。为了退出程序,你必须做的:

jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

你也可以这样做:

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

一起使用无法正常工作。该程序仍然运行在任务管理器:(我要更新我的代码 –

+0

我添加了另一个选项,请尝试 –

+0

@ benjamin.d,这是完全无关的,他直接调用System.exit()。看到Hovercraft的回答 – jzd

3

running变量需要声明volatile,你需要把它在某些时候设置为false在结束之前。

说了这么多,该代码看起来很危险和恶劣:

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

你没有Thread.sleep(...)内出现,所以它的风险霸占CPU,并且因为它看起来像你想修改摇摆州关闭Swing事件线程时,会遇到间歇性线程故障的危险。这表明你想要使用Swing Timer。


注意,为更全面的帮助,请考虑张贴演示您的问题,一个SSCCE最小的代码示例。这将允许我们运行你的代码并修改它,甚至可以纠正它。请在回复之前阅读链接,因为它提供了关于SSCCE要求的许多重要细节。

+0

我发现我做错了什么,看起来在扩展这个类的时候,这个是使用网络摄像头的,当我调用System.exit函数时,摄像头带领我因此我想我不需要正确地发布它,但实际上它是需要的。 –

+0

@RicardoAlves:谢谢你的更新。但我再次支持我的建议,即关注如何仅在Swing线程中更新Swing问题。 –

+1

@RicardoAlves,您的评论并未描述代码执行系统的相关问题。我的意思是,你应该首先明白为什么你的程序即使在你退出后也停止退出。忘掉你的摄像头。首先知道一段时间停止线程执行并唤醒它的规则;以及主线程和子线程的关系。主线程只会在没有子线程运行而不是“守护程序”线程时退出。 – Sage

相关问题