BoxLayout是Swing提供的布局管理器,所以用于管理Swing组件将会有更好的表现。
GridBagLayout布局管理器虽然功能强大,但它实在太复杂了,所以Swing引入了一个新的布局管理器:BoxLayout,它保留了GridBagLayout的很多优点,但是却没那么复杂。BoxLayout可以再垂直和水平两个方向上摆放GUI组件,BoxLayout提供了如下一个简单的构造器。
BoxLayout提供了一个简单的构造器:
BoxLayout(Container target, int axis):指定创建基于target容器的BoxLayout布局管理器,该布局管理器里的组件按axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
/**
* 程序简单示范了使用BoxLayout布局管理器来控制容器中按钮的布局
*/
package codes11;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.BoxLayout;
public class BoxLayoutTest {
private Frame f = new Frame("测试窗口");
public void init() {
f.setLayout(new BoxLayout(f, BoxLayout.Y_AXIS));
f.add(new Button("第一个按钮"));
f.add(new Button("按钮二"));
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new BoxLayoutTest().init();
}
}
运行程序,结果如下图:
BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,他有点像Panel容器,但该容器默认使用BoxLayout布局管理器。
Box提供了两个静态方法来创建Box 对象:
(1)createHorizontalBox():创建一个水平排列组件的Box容器
(2)createBerticalBox():创建一个垂直排列组件的Box容器
一旦获取了Box容器之后,就可以使用Box来盛装普通的GUI组件,然后将这些Box组件添加到其它容器中,从而形成整体的窗口布局。
/**
* 程序示范了如何使用Box容器
*/
package codes11;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.Box;
public class BoxTest {
private Frame f = new Frame("测试");
// 定义水平摆放组件的Box对象
private Box horizontal = Box.createHorizontalBox();
// 定义水平摆放组件的Box对象
private Box vertical = Box.createVerticalBox();
public void init() {
horizontal.add(new Button("水平按钮一"));
horizontal.add(new Button("水平按钮二"));
vertical.add(new Button("垂直按钮一"));
vertical.add(new Button("垂直按钮二"));
f.add(horizontal, BorderLayout.NORTH);
f.add(vertical);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new BoxTest().init();
}
}
运行程序,结果如下图:
BoxLayout没有提供设置间距的构造方法,因为BoxLayout采用另一种方式来控制组件的间距——BoxLayout使用Glue(橡胶)、Strut(支架)和RigidArea(刚性区域)的组件来控制组件间的间距。其中Glue代表可以在横向、纵向两个方向上同时拉伸的空白组件(间距),Strut代表可以在横向、纵向任意一个方向上拉伸的空白组件(间距),RigidArea代表不可拉伸的空白组件(间距)
Box提供了5个静态方法来创建Glue、Strut和RigidArea:
(1)createHorizontalGlue():创建一条水平Glue(可在两个方向上同时拉伸的间距)
(2)createVerticalGlue():创建一条垂直Glue(可在两个方向上同时拉伸的间距)
(3)createHorizontalStrut(int width):创建一条指定宽度的水平Strut(可在垂直方向上同时拉伸的间距)
(4)createVerticalStrut(int height):创建一条指定高度的水平Strut(可在水平方向上同时拉伸的间距)
(5)createRigidArea(Dimension d):创建指定宽度、高度的RigidArea(不可拉伸的间距)
上面5个方法都返回Component对象(代表间距),程序可以将这些分隔Component添加到两个普通的GUI组件之间,用以控制组件的间距。
下面程序使用上面3种间距来分隔Box中的按钮:
package codes11;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.Box;
public class BoxSpaceTest {
private Frame f = new Frame("测试");
// 定义水平摆放组件的Box对象
private Box horizontal = Box.createHorizontalBox();
// 定义水平摆放组件的Box对象
private Box vertical = Box.createVerticalBox();
public void init() {
horizontal.add(new Button("水平按钮一"));
horizontal.add(Box.createHorizontalGlue());
horizontal.add(new Button("水平按钮二"));
// 水平方向不可拉伸的间距,其宽度为10px
horizontal.add(Box.createHorizontalStrut(10));
horizontal.add(new Button("水平按钮三"));
vertical.add(new Button("垂直按钮一"));
vertical.add(Box.createVerticalGlue());
vertical.add(new Button("垂直按钮二"));
// 垂直方向不可拉伸的间距,其高度为10px
vertical.add(Box.createVerticalStrut(10));
vertical.add(new Button("垂直按钮三"));
f.add(horizontal, BorderLayout.NORTH);
f.add(vertical);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new BoxSpaceTest().init();
}
}
运行程序,结果如下图: