驯服Tiger: 利用Tiger为窗格减压2011-01-31John Zukowski欢迎来到没有内容窗格的世界。在研究如何可以不 使用内容窗格之前,让我们先看一下内容窗格是什么,以及它为什么存在。在 Swing 中,所有顶级容器,比如 JFrame、JApplet 和 JDialog,都是由 JRootPane 来内部管理的。但是,为什么这些帧不自己管理自己呢?根窗格使顶级对象能够拥有菜单栏、将对象拖到其他组件之上的 glass 窗格,以及一个用于包含所有容器组件的内容窗格。而您要用这个内容窗格来设置布局管理器和添加组件,如图 1 所示。因为所有的顶级容器都需要相同的对象集合,所以其管理被委派给 JRootPane。图 1. JRootPane 容器

老方法在了解使用内容窗格(或者“令人痛苦的东西”,视情况而定)的新方法之前,让我们回过头来看一下在引入 Swing 之前是如何使用内容窗格的。在 5.0 版本之前,无法设置帧的布局管理器或者直接将组件添加到帧中。您必须获得该帧的内容窗格,用它作为替代。清单 1 中显示了一般的内容窗格使用流程:清单 1. 5.0 之前的内容窗格使用情况
JFrame frame = new JFrame("Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = ...;
JButton button = ...;
Container contentPane = frame.getContentPane();
LayoutManager layout = new GridLayout(1,2);
contentPane.setLayout(layout);
contentPane.add(label);
contentPane.add(button);内容窗格本身并不难使用,但是编程人员未必总是记得直接处理内容窗格。如果您偶尔想试着更改帧的布局管理器或者在运行期间直接将组件添加到帧中,那么您将看到以下错误:
java.lang.Error: Do not use javax.swing.JFrame.setLayout() use
javax.swing.JFrame.getContentPane().setLayout() instead这就是所有人都在猜测的,为什么 Java 平台不够智能,无法知道您试图更改帧的布局管理器时实际上是想为内容窗格更改布局管理器。在 5.0 版本之前,您必须记得在做其他任何事之前,要先获得内容窗格。