2011-10-14 42 views
0

我有,我想從一個JButton也進一步關閉比窗口上的標準的X按鈕windowbuilderpro開發的一類,所以這裏的類的實例:從一個JButton過程中關閉的JFrame仍然活着,

public class MainWindow { 

public JFrame frame; 

public MainWindow() { 
    initialize(); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

public void show() { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       //Show the main Frame 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

當我從X按鈕關閉窗口時,窗口正確關閉,進程終止。

當我關閉,而不是從一個JButton有這個監聽器:

mntmExit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //Close the application main form 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 

框架窗口接近正常,但該過程仍然活着,爲什麼?

Process Alive

正如你可以看到有開始和持續終止AWT-關閉線程,我怎麼能做到這一點還關閉應用程序的X按鈕相同的行爲呢?

注:

System.exit(0);是不適合的,因爲它也終止了應用程序,如果有另一個後臺運行線程,我不想這樣做。 MainWindow類應該關閉並釋放它的資源,這與使用關閉MainWindow實例的X按鈕關閉應用程序的行爲相同,但如果有後臺線程正在運行,它不會殺死它們,而是等待它們完成工作。

環境:

  • JDK 7
  • 的Eclipse 3.7.1
+0

是我應該befo說回覆: - 爲了更快地獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。在SSCCE中,一個鬆散的計時器會很明顯。而且由於我提到的是代碼,你可以選擇縮進代碼的邏輯樣式之一,並堅持以後的帖子?我花了很長時間重新格式化並理解了代碼,而不是將代碼轉換爲工作代碼。 –

回答

2

不知道你真正需要的東西,看起來像您再次再次創造新的JFrame,不這樣做,一旦創建的JFrame並重新使用該集裝箱

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // do nothing 

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // same as setVisible(false) 

然後visibily你只能調用frame.setVisible(true);

更多的部分舒適是覆蓋WindowListener,那麼你就可以控制一些活動

+0

我只創建了一次框架實例,爲什麼如果我用窗口標題上的X按鈕關閉窗體我得到正確的行爲,而是如果我關閉框架調用處置我得到我不同的行爲? – aleroot

+0

implements WindowListener創建一個void從JButton與WindowListener共享Action,hmmm使用JPopumMenu實現SystemTry,使用JFrame添加JMenuItem#setVisible(true); – mKorbel

-1

只需添加一行:

System.exit(0); 
+0

Syste.exit(0);如果在另一個線程中有一個正在運行的後臺進程並且終止了我的後臺線程,請關閉該應用程序!我不想那麼做! – aleroot

+0

-1這是錯誤的答案。 –

+0

當我回答這個問題時,aleroot沒有談論後臺進程,並且在我回答後編輯了他的問題。 – Balconsky

2

x按鈕或Exit按鈕被激活時,此代碼中的所有線程均會停止。你有不同的行爲嗎?

import java.awt.event.*; 
import javax.swing.*; 

public class MainWindow { 

    public JFrame frame; 
    JButton mntmExit = new JButton("Exit"); 

    public MainWindow() { 
     frame = new JFrame("Close Me!"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     mntmExit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       //Close the application main form 
       frame.setVisible(false); 
       frame.dispose(); 
      } 
     }); 
     frame.add(mntmExit); 
     frame.pack(); 
     show(); 
    } 

    public void show() { 
     //Show the main Frame 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       MainWindow mw = new MainWindow(); 
       mw.show(); 
      } 
     }); 
    } 
} 
+0

是的,當我嘗試關閉退出按鈕的框架線程保持活着,你可以看到在屏幕截圖圖像,而不是如果我關閉窗口的X按鈕窗口應用程序關閉正確,因爲沒有其他線程處於活動狀態。我想用我創建的關閉按鈕實現相同的行爲...我使用的是JDK 7。 – aleroot

+0

在JDK 6中試用它。如果它在Java 7中顯示不同的行爲(可能還有很多錯誤),那麼它可能是一個..bug。 –

+1

剛剛運行這個程序與構建1.7.0-b147和構建1.6.0_25-b06,都在x64上,他們很好地關閉。只是覺得我會提出一些支持,可能是版本問題。 – pimaster

相關問題