4

ここで述べたように:コンテンツ ペインへのコンポーネントの追加

デフォルトのコンテンツ ペインは、JComponent から継承し、レイアウト マネージャとしてBorderLayoutを使用する単純な中間コンテナです。

そしてここに証明があります:

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

ただし、次のコードの出力について説明できますか?

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());

出力:

javax.swing.JRootPane$1[hgap=0,vgap=0]
javax.swing.JRootPane$1
java.awt.BorderLayout[hgap=0,vgap=0]
java.awt.BorderLayout
4

1 に答える 1

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;
    }

contentpane を作成するメソッドは、BorderLayout から継承する匿名の内部クラスを作成します。そのため、instanceof でテストすると true が返されますが、それは別のクラスであるため、クラス名が異なります。

于 2012-07-09T05:31:41.783 に答える