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

Tom*_*ine 2 java puzzle layout swing

如果我设置一个布局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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

java.awt.BorderLayout[hgap=0,vgap=0]
Run Code Online (Sandbox Code Playgroud)

但如果我更换JFrameJPanel我得到

java.awt.GridLayout[hgap=0,vgap=0,rows=1,cols=0]
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 11

来自Java APIJFrame:

public void setLayout(LayoutManager manager)
Run Code Online (Sandbox Code Playgroud)

设置LayoutManager.重写以有条件地将呼叫转发给contentPane.请参阅以RootPaneContainer获取更多信息.

并从RootPaneContainer页面:

此接口用作Swing GUI构建器的标记,这些构建器需要特别处理JFrame包含单个组件的组件JRootPane.为方便起见JFrame,JDialog,JWindow,JAppletJInternalFrame,默认情况下,向前,默认情况下,所有调用的add,removesetLayout方法,对contentPane.这意味着您可以致电:

rootPaneContainer.add(component);
Run Code Online (Sandbox Code Playgroud)

代替:

rootPaneContainer.getContentPane().add(component);
Run Code Online (Sandbox Code Playgroud)

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