如果你曾经为文本模式的应用程序设计过用户界面,那么你就会熟悉其中所涉及的问题。你需要获得每个标签、菜单、输入字段以及其他修饰元素,再把它们放到屏幕上显示,还要考虑每个东西的尺寸以及屏幕的尺寸。由于所有这些参数都是提前知道的,所以一些简单的算法就能够很好地完成这项工作。
但是,相同的情况却不会发生在图形应用程序上,因为每个元素最佳的尺寸和位置都依赖于多个因素,而这些因素在编辑的时候常常是不可知的,例如屏幕的分辨率、窗口和字体的大小等等。这就不可能手动计算其位置和尺寸了。
Java运用了一个原始的解决方案来解决这个问题——布局管理器,它能够让你只使用Java代码(不需要使用可视化工具)就设计出复杂的适合任何屏幕分辨率和尺寸的用户界面。
现在让我们来看一下布局管理器,看它们是如何工作的,以及如何创建自定义的布局管理器的,这样你就能够在必要的时候有效地使用那些Java平台自带的布局管理器,或者开发你自己的。我会假设你已经熟悉了AWT和/或Swing。
概述
布局管理器是一个对象,其唯一的任务就是将组件安放(也就是说,确定其尺寸和位置)进一个容器里(container)。每个容器都有一个java.awt.Container的子类,并提供一个方法——setLayout,用来指定要被使用的布局管理器。
在通常情况下,容器已经被指定了一个缺省的布局管理器,而且如果没有正确设置的话还可以通过setLayout来更改。而其他的东西则要使用一个专用的布局管理器,它们就不能够或者不应该被更改了,例如java.awt.ScrollPane和javax.swing.JRootPane。
布局管理器必须要实现java.awt.LayoutManager或者java.awt.LayoutManager2这两个接口。Java平台已经自带了很多布局管理器,所以你需要做的就是将正确的类实例化,再调用容器的setLayout,同时传递最新创建的布局管理器。
你甚至能够完全不使用布局管理器(例如将null传递给setLayout),但是在这种情况下,你必须使用java.awt.Component的正确方法(例如,setBounds、setLocation和setSize)来手动指定每个组件的位置和尺寸。