2012-06-29 65 views
0

我想有一個窗口的行爲就像一個對話框,它關閉與父窗口,但它應該像一個正常的框架,特別是它應該有最大化/恢復按鈕。我如何創建綁定到父窗口的窗口(它們在父窗口關閉時關閉)並繼承一些屬性,即windowicon?帶調整大小的對話框最小化或框架取決於父

我能想到的最好的方法是編寫我自己的課程,包裝一個JFrame並帶上父母。這個類將一個Listener安裝到父級並跟蹤其所有實例,以便在父級關閉時關閉所有實例。 Exit_on_close不能用於父級,因爲應用程序的其餘部分應該繼續運行。

那麼,有沒有一種簡單的方法,還是我必須推出自己的班級?

回答

2

您可以複製幾乎除了其對JFrame的頂部定位任何的JDialog行爲(有該案例適用於Win平臺,但它的使用是一件壞事一些本地的解決方案......真的)。

這裏是你可以在短短几分鐘的時間做一個例子:

ChildFrameTest.java

public class ChildFrameTest 
{ 
    public static void main (String[] args) 
    { 
     JFrame application = new JFrame(); 
     application.setSize (600, 600); 
     application.setLocationRelativeTo (null); 
     application.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); 

     JChildFrame tool = new JChildFrame (application); 
     tool.setModalExclusionType (Dialog.ModalExclusionType.APPLICATION_EXCLUDE); 
     tool.setSize (100, 600); 
     tool.setLocation (application.getX() + application.getWidth(), application.getY()); 

     new WindowFollowListener (tool, application); 

     application.setVisible (true); 
     tool.setVisible (true); 
    } 

    public static class JChildFrame extends JFrame 
    { 
     public JChildFrame (JFrame parent) 
     { 
      super(); 
      parent.addWindowListener (new WindowAdapter() 
      { 
       public void windowClosing (WindowEvent e) 
       { 
        dispose(); 
       } 
      }); 
     } 
    } 
} 

而且WindowFollowListener添加一些漂亮的子框架的行爲:

WindowFollowListener.java

public class WindowFollowListener extends ComponentAdapter 
{ 
    private boolean enabled = true; 
    private Window followingWindow; 
    private Window parentWindow; 
    private Point ll; 

    public WindowFollowListener (Window followingWindow, Window parentWindow) 
    { 
     super(); 

     this.followingWindow = followingWindow; 
     this.parentWindow = parentWindow; 
     this.ll = parentWindow.getLocation(); 

     parentWindow.addComponentListener (this); 
    } 

    public boolean isEnabled() 
    { 
     return enabled; 
    } 

    public void setEnabled (boolean enabled) 
    { 
     this.enabled = enabled; 
    } 

    public Window getFollowingWindow() 
    { 
     return followingWindow; 
    } 

    public void setFollowingWindow (Window followingWindow) 
    { 
     this.followingWindow = followingWindow; 
    } 

    public Window getParentWindow() 
    { 
     return parentWindow; 
    } 

    public void setParentWindow (Window parentWindow) 
    { 
     this.parentWindow = parentWindow; 
    } 

    public void componentResized (ComponentEvent e) 
    { 
     this.ll = parentWindow.getLocation(); 
    } 

    public void componentMoved (ComponentEvent e) 
    { 
     if (enabled && followingWindow != null && parentWindow != null) 
     { 
      Point nl = parentWindow.getLocation(); 
      Point fwl = followingWindow.getLocation(); 
      followingWindow.setLocation (fwl.x + nl.x - ll.x, fwl.y + nl.y - ll.y); 
      this.ll = nl; 
     } 
    } 
} 
+0

謝謝你,所以基本上我必須把自己包裹起來,但這很簡單。感謝代碼示例。 – ted

+1

@ ye yeh,只是包裝JFrame並添加一些需要的偵聽器,以便它像一個附加的框架。您還可以通過將「setEnabled(false)」設置爲主框架來使「子」框架像模態JDialog一樣工作。 –