第四章 第三节 使用FillLayout
FillLayout是布局类中最简单的,它把所有的控件放在一行或一列,并使它们有相同的大小。它有一个公有(public)的属性和类型,决定控件是放在一行还是放在一列。可以把类型传递给构造函数,也可以在构造函数后设置类型。FillLayout的构造函数请参见表4-1。
表 4-1:FillLayout的构造函数
构造函数 | 说明 |
public FillLayout() | Constructs a FillLayout and sets type to SWT.HORIZONTAL. |
public FillLayout(int type) | Constructs a FillLayout and sets type to the passed type. |
type可取的值有SWT.HORIZONTAL和SWT.VERTICAL,它们分别把控件放在一行和一列。
注意:FillLayout不检查type的合法性,所以可以传递任意的int值。尽管FillLayout的默认设置是SWT.HORIZONTAL,但如果传递一个既非SWT.HORIZONTAL又非SWT.VERTICAL的值,它将使用SWT.VERTICAL。
下面的代码创建一个水平的FillLayout并把它赋给Shell:
FillLayout layout = new FillLayout();
layout.type = SWT.HORIZONTAL;
shell.setLayout(layout);
也可以裁去一行(精简一行),在构造函数中传入样式(type)就行了;下面的代码创建垂直的FillLayout:
FillLayout layout = new FillLayout(SWT.VERTICAL);
shell.setLayout(layout);
如果把布局(layout)赋给Shell后不需保留layout的引用(reference),可以一步完成:
shell.setLayout(new FillLayout(SWT.VERTICAL));
我们来看一个FillLayout的例子。在下面的代码中,我们创建一个Display和Shell,然后创建一个水平的FillLayout并把它作为布局(layout)赋给Shell。接着,添加三个按钮,分别标为one,two,three,最好进入事件循环。这些代码在一行中显示三个按钮,填满了整个窗体(见图4-1)。
要编译并运行这段代码,在examples/ch4目录下创建文件FillLayoutHorizontal.java。把清单4-1中的代码输入文件并保存。接着打开命令提示行或shell,转到examples的父目录(parent directory)。把在第三章创建的build.xml文件复制到父目录,然后输入:
清单4-1 FillLayoutHorizontal.java
ant -Dmain.class=examples.ch4.FillLayoutHorizontal
package examples.ch4;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
public class FillLayoutHorizontal {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout(SWT.HORIZONTAL));
new Button(shell, SWT.PUSH).setText("one");
new Button(shell, SWT.PUSH).setText("two");
new Button(shell, SWT.PUSH).setText("three");
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
注意要用main class的完整的包名称(full package name)。这个类编译和运行后,就可以看到如图4-1所示的窗体。
本书中,我们不再重复这些说明;在我们介绍新的代码时,沿用前面的步骤,用相应的类名称取代examples.ch4.FillLayoutHorizontal。
如果像下面这样,把SWT.VERTICAL传递给FillLayout的构造函数, 这些按钮就会排成一列(见图4-2)。
shell.setLayout(new FillLayout(SWT.VERTICAL));
图4-2 垂直的FillLayout
FillLayout只能实现相对简单的布局(layout),因此多用于嵌套的复合控件(nested composite)。要实现复杂的布局,就要用到更高级的布局类(layout classes)。