JFrame的contentPane的LayoutManager

Eng*_*uad 4 java swing jframe border-layout contentpane

如上所述:向内容窗格添加组件,

默认内容窗格是一个简单的中间容器,它继承自JComponent,并使用BorderLayout作为其布局管理器.

这是一个证据:

JFrame frame = new JFrame();
LayoutManager m = frame.getContentPane().getLayout();
System.out.println(m instanceof BorderLayout); // prints true
Run Code Online (Sandbox Code Playgroud)

但是,您能解释下面代码的输出吗?

JFrame frame = new JFrame();

LayoutManager m = frame.getContentPane().getLayout();
System.out.println(m);
System.out.println(m.getClass().getName());

LayoutManager m2 = new BorderLayout();
System.out.println(m2);
System.out.println(m2.getClass().getName());
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

javax.swing.JRootPane$1[hgap=0,vgap=0]
javax.swing.JRootPane$1
java.awt.BorderLayout[hgap=0,vgap=0]
java.awt.BorderLayout
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 5

这解释了你的结果:

 protected Container createContentPane() {
        JComponent c = new JPanel();
        c.setName(this.getName()+".contentPane");
        c.setLayout(new BorderLayout() {
            /* This BorderLayout subclass maps a null constraint to CENTER.
             * Although the reference BorderLayout also does this, some VMs
             * throw an IllegalArgumentException.
             */
            public void addLayoutComponent(Component comp, Object constraints) {
                if (constraints == null) {
                    constraints = BorderLayout.CENTER;
                }
                super.addLayoutComponent(comp, constraints);
            }
        });
        return c;
    }
Run Code Online (Sandbox Code Playgroud)

创建contentpane的方法创建了一个继承自BorderLayout的匿名内部类.因此,对instanceof的测试将返回true,但是它的另一个类因此类名称不同.

  • 此外,类名中的`$`是一个内部类正在发挥作用的标志.在这种情况下,内部类是匿名的,因此您将看到$ 1而不是实际名称. (4认同)