2009-07-08 188 views
2

如果我用setLayoutJFrame上设置布局,然后用getLayout检索它,则会得到不同的LayoutManager。这里发生了什么??为什么JFrame布局不是我设置的布局?

public class Lay { 
    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       java.awt.Container container = 
        new javax.swing.JFrame(); 
        //new javax.swing.JPanel(); 
       java.awt.LayoutManager layout = 
        new java.awt.GridLayout(); 
       container.setLayout(layout); 
       layout = container.getLayout(); 
       System.err.println(layout); 
      } 
     }); 
    } 
} 

给人

java.awt.BorderLayout[hgap=0,vgap=0] 

,但如果我JPanel取代JFrame我得到

java.awt.GridLayout[hgap=0,vgap=0,rows=1,cols=0] 

回答

11

Java API for JFrame

public void setLayout(LayoutManager manager) 

设置LayoutManager。被覆盖以有条件地将呼叫转移到contentPane。有关更多信息,请参阅RootPaneContainer

而且从RootPaneContainer页:

这个接口作为需要治疗组件,如JFrame的Swing GUI构建器,包含单个JRootPane,特别标记。为了方便JFrameJDialogJWindowJAppletJInternalFrame,默认情况下,向前,默认情况下,所有的呼叫到addremovesetLayout方法,对contentPane。这意味着您可以拨打:

rootPaneContainer.add(component); 

代替:

rootPaneContainer.getContentPane().add(component); 

一个JRootPane是所有重量级组件使用看起来像本地操作系统窗口共同组成。它处理菜单栏,关闭/最小化/最大化按钮等。JFrame试图隐藏JRootPane做你真正的工作,但在这种情况下,它只是让事情更混乱。

+0

领先于我。干得好先生! – basszero 2009-07-08 19:40:59