2013-11-21 141 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

相關問題