为什么JFrame布局不是我设置的那个?

时间:2009-07-08 19:33:52

标签: java swing layout puzzle

如果我使用JFramesetLayout上设置布局,然后使用getLayout检索它,那么我会得到一个不同的LayoutManager。这是怎么回事?

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]

但如果我将JFrame替换为JPanel,我会

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

1 个答案:

答案 0 :(得分:11)

来自Java API for JFrame

public void setLayout(LayoutManager manager)
     

设置LayoutManager。重写以有条件地将呼叫转发至contentPane。有关详细信息,请参阅RootPaneContainer

来自RootPaneContainer页面:

  

此接口用作Swing GUI构建器的标记,需要处理包含单个JFrame的{​​{1}}等组件。为方便起见JRootPaneJFrameJDialogJWindowJApplet,默认情况下,默认转发所有对JInternalFrame的调用, add方法removesetLayoutcontentPane。这意味着您可以致电:

rootPaneContainer.add(component);
     

而不是:

rootPaneContainer.getContentPane().add(component);

JRootPane是所有重量级组件使用的常见组件,看起来像本机操作系统窗口。它处理菜单栏,关闭/最小化/最大化按钮等。JFrame试图隐藏JRootPane从事真实工作的事实,但在这种情况下,它只是让事情变得更加混乱。 / p>