0

このクラスをインスタンス化するコードを実行する場合:

static final class MyFrame extends JFrame {
    private CardLayout layout = new CardLayout();

    public MyFrame() {
        setLayout(layout);
        System.out.println(getLayout());
    }
}

印刷される結果は次のとおりです。

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

これはJFrameデフォルトのレイアウトです。レイアウトは変更されません。でも、私が変われば

setLayout(layout);

getContentPane().setLayout(layout)

getLayout()正しいレイアウトを印刷します。

MVCE:

レイアウトを設定しない:

public class Main {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            MyFrame frame = new MyFrame();
            frame.setVisible(true);
        });
    }

    static final class MyFrame extends JFrame {
        private CardLayout layout = new CardLayout();

        public MyFrame() {
            setLayout(layout);
            System.out.println(getLayout());
        }
    }
}

設定レイアウト:

public class Main {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            MyFrame frame = new MyFrame();
            frame.setVisible(true);
        });
    }

    static final class MyFrame extends JFrame {
        private CardLayout layout = new CardLayout();

        public MyFrame() {
            getContentPane().setLayout(layout);
            System.out.println(getLayout());
        }
    }
}
4

1 に答える 1

5

どこかで何かが欠けていると思います。を使用した私のPCでの結果は次のとおりです

setLayout(layout);
System.out.println(getContentPane().getLayout()); // CardLayout is printed
System.out.println(getLayout()); // BorderLayout is printed

getContentPane().setLayout(layout);
System.out.println(getContentPane().getLayout()); // CardLayout is printed
System.out.println(getLayout()); // BorderLayout is printed

CardLayout が常に印刷されないのはなぜですか?

とは異なりJFrame#setLayout(LayoutManager)JFrame#getLayout()はその を呼び出さないためcontentPane()です。

実際のところ、JFrame#getLayout()は実際には継承元であり、実際のコンポーネントから実際のコンポーネントContainer#getLayout()を返しLayoutManagerます (この場合JFrameは、その ではありませんcontentPane())。


JFrame#setLayout

LayoutManager を設定します。contentPane への呼び出しを条件付きで転送するようにオーバーライドされます。詳細については、RootPaneContainer を参照してください。

于 2015-12-04T13:03:43.277 に答える