驯服Tiger:利用Tiger为窗格减压

欢迎来到没有内容窗格的世界。在研究如何可以不 使用内容窗格之前,让我们先看一下内容窗格是什么,以及它为什么存在。在 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 版本之前,您必须记得在做其他任何事之前,要先获得内容窗格。

使用 Tiger 的方法

通过使用 5.0 版本,Swing 开发人员的生活变得更加轻松。虽然内容窗格仍然存在,但您几乎不必直接使用它。调用 setLayout()、add() 和 remove() 现在被转到内容窗格上进行。换句话说,现在不用获得诸如包含 getContentPane() 的 JFrame. 之类的高级容器的内容窗格,然后对其进行操作,而是直接在帧对象上调用 setLayout()、add() 和 remove() 即可。清单 2 显示了处理帧的新方法:

清单 2. Tiger 技术

JFrame. frame. = new JFrame("Title"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = ...; JButton button = ...; LayoutManager layout = new GridLayout(1,2); frame.setLayout(layout); frame.add(label); frame.add(button);

结束语

指出这样一点很重要,即内容窗格并没有从框架中删除掉,只是您通常不必直接处理它了。为什么只是说通常,而不是说总是呢?实际上,有时您确实 必须直接处理内容窗格。在帧上调用 setBackground() 无法将该调用传递给内容窗格,它只会改变帧的背景。setComponentZOrder() 方法是另一种类似的处理方法。在帧上调用 setComponentZOrder() 将改变帧中的布局。实际上,您真正需要的方法是在内容窗格上调用 setComponentZOrder(),因为它随后将处理内容窗格中组件的叠置顺序(z-order)。

理想的路总是为有信心的人预备着

驯服Tiger:利用Tiger为窗格减压

相关文章:

你感兴趣的文章:

标签云: