2013-03-12 48 views
0

我有一個應用程序,有時我使用「模式」,較小的窗口。爲了模擬這種模式行爲,我所做的就是將它們定義爲JFrame的擴展,禁用主應用程序框架並將默認關閉操作設置爲什麼也不做。這樣做的問題是JFrame不能有父級,所以當用戶單擊按鈕說關閉窗口時,它實際上關閉,系統返回到最後使用的應用程序,這並不總是期望的效果(例如,用戶打開模式窗口,然後他/她Alt + Tabs進入另一個應用程序,然後切換回模態窗口並關閉它,導致顯示最後一個應用程序,而不是我的主框架)。有沒有辦法做到這一點(將JFrame綁定到父類或類似的東西上?)。請注意,JOptionPane不是一個選項,因爲這些較小的窗口需要在每個窗口內有二十個不同的自定義組件。Java Swing - 保持所有JFrames在一起

+2

爲什麼不出去'JDesktopPane'?你可以看看這裏知道如何使用它:http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html – 2013-03-12 18:14:45

+0

看起來像一個很好的選擇,但JDialog似乎更容易使用,因爲JDesktopPane是JFrame的容器,因此我仍然需要具有JFrame,但是JDialog允許我簡單地將「extends JFrame」替換爲「extends JDialog」。無論如何,因爲我從來沒有聽說過這個班,所以看起來很有用。 – 2013-03-12 18:27:16

+0

'JDesktopPane'是'JInternalFrame'而不是'JFrame'的容器.. – 2013-03-12 18:29:25

回答

2

爲什麼不使用JDialog? :-)

+0

正是我在找的,謝謝@ D.R。 – 2013-03-12 18:27:45

0

您可以將JFrame參數添加到構造函數,並在內部將其另存爲父項,並將子項的引用保存在父項的列表中。然後,您可以在關閉窗口之前重寫dispose方法並關閉所有子/父項。

例如:

public class ParentWindow extends JFrame { 

    //Here you add children when you create them 
    List<JFrame> children = new ArrayList<JFrame>(); 

    @Override 
    public void dispose() { 
     for(JFrame f : children) { 
      f.dispose(); 
     } 
     super.dispose(); 
    } 

    public void randomMethod() { 
     JFrame newWindow = new JFrame(this); 
     children.add(newWindow); 
    } 
} 

public class ChildWindow extends JFrame { 

    //Here you save the parent window 
    JFrame parent; 
    public ChildWindow(JFrame parent) { 
     this.parent = parent; 
    } 

    @Override 
    public void dispose() { 
     parent.dispose(); 
     super.dispose(); 
    } 
}