When running code that instantiates this class:
static final class MyFrame extends JFrame {
private CardLayout layout = new CardLayout();
public MyFrame() {
setLayout(layout);
System.out.println(getLayout());
}
}
The results that are printed are:
java.awt.BorderLayout[hgap=0,vgap=0]
Which is JFrame
s default layout. The layout is not changed. But, if I change
setLayout(layout);
to
getContentPane().setLayout(layout)
getLayout()
will print the correct layout.
MVCEs:
Not setting layout:
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());
}
}
}
Setting layout:
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());
}
}
}
I think you're missing something somewhere. Here are the results on my pc using eclipse and java-8
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
Because, unlike JFrame#setLayout(LayoutManager)
, JFrame#getLayout()
does not make a call to its contentPane()
.
As a matter of fact, JFrame#getLayout()
is actually inherited from Container#getLayout()
which will return the actual LayoutManager
from the actual component (in this case JFrame
and not its contentPane()
).
JFrame#setLayout
Sets the LayoutManager. Overridden to conditionally forward the call to the contentPane. Refer to RootPaneContainer for more information.