2015-04-25 85 views
0

在Java Swing中有找到並關閉所有當前顯示的對象的方法嗎?關閉所有Java子窗口

我有一個很大的應用程序,並且有多個部分可以調用來顯示一個對話框,但是我希望能夠檢測並關閉它。

+1

什麼是「子框架」?請參閱[使用多個JFrames,好/壞實踐?](http://stackoverflow.com/q/9554636/418556) –

+0

不要點擊'後退按鈕'來編輯帖子!使用問題下方的「編輯」鏈接.. –

+0

道歉我已經改寫了這個問題。 –

回答

3

保留每個對話框的引用(可能在一個集合中)。在需要時,重複收集並致電dialog.setVisible(false)

正如@mKorbel建議,你也可以使用:

Window[] windows = Window.getWindows(); 

你只需要遍歷數組和關閉東西的時候來檢查「父」窗口。

+1

保留對每個對話框的引用?= Window [] windows = Window.getWindows(); – mKorbel

+0

@mKorbel這將工作。 .. –

2

其中超JFrameWindow有方法getOwnedWindows,你可以用它來獲得所有子陣列(獨資)Window秒(包括JFrame S和JDialog S)。

public class DialogCloser extends JFrame { 

    DialogCloser() { 

     JButton closeChildren = new JButton("Close All Dialogs"); 
     JButton openDiag = new JButton("Open New Dialog"); 

     closeChildren.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       Window[] children = getOwnedWindows(); 
       for (Window win : children) { 
        if (win instanceof JDialog) 
         win.setVisible(false); 
       } 
      } 
     }); 

     openDiag.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       JDialog diag = new JDialog(DialogCloser.this); 
       diag.setVisible(true); 
      } 
     }); 

     getContentPane().add(openDiag, BorderLayout.PAGE_START); 
     getContentPane().add(closeChildren, BorderLayout.CENTER); 

     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new DialogCloser(); 
    } 
} 

編輯:

問題改爲

查找和當前正在顯示

關閉所有JDialog對象,我還以爲他們是所有孩子同一父母。

0

下面這段代碼的伎倆:

private void closeAllDialogs() 
{ 
    Window[] windows = getWindows(); 

    for (Window window : windows) 
    { 
     if (window instanceof JDialog) 
     { 
      window.dispose(); 
     } 
    } 
}