运行实例化此类的代码时:
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()
将打印正确的布局。
MVCEs:
未设置布局:
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());
}
}
}
答案 0 :(得分:4)
我觉得你在某个地方遗失了什么。以下是使用eclipse和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
与JFrame#setLayout(LayoutManager)
不同,JFrame#getLayout()
不会调用contentPane()
。
事实上,JFrame#getLayout()
实际上是从Container#getLayout()
继承的,它会从实际组件中返回实际的LayoutManager
(在这种情况下为JFrame
而不是contentPane()
{1}})。
JFrame#setLayout
设置LayoutManager。重写以有条件地转发呼叫 到contentPane。有关更多信息,请参阅RootPaneContainer。