22.10 复杂布局管理器的种类及用法

布局管理就是在界面中,设计哪些控件对齐,哪些控件在同一个范围内,还有控件该在什么地方显示。本节将介绍一些复杂布局管理器,其中包括箱式布局管理器和网格组布局管理器。

22.10.1 箱式布局的设计

箱式布局比GridLayout布局要灵活的多,这也是它比较实用的地方。Swing提供的BOX类就是箱式布局类,它的默认布局管理器就是BoxLayout,在箱式布局管理器中包括了两种箱子:一种是水平箱,另外一种是垂直箱。

说明 GridLayout是最简单的一种布局,其包含在java.awt.*中,这里没有单独介绍。

创建一个水平箱:


Box horBox=Box.createHorizontalBox();


创建一个垂直箱:


Box verBox=Box.createVerticalBox();


创建好箱子后,就可以像添加其他组件一样,添加控件,代码如下所示。


horBox.add(okButton);

verBox.add(cancelButton);


两种箱子的区别在于组件的排列顺序上,水平箱是按照从左到右的顺序排列,而垂直箱按照从上到下的顺序排列。对于箱式布局管理器,最关键的就是每个组件的三个尺寸。

❑首选尺寸,即组件显示时的宽度和高度。

❑最大尺寸,即组件能显示的最大宽度和最大高度。

❑最小尺寸,即组件被显示的最小高度和最小宽度。

下面是水平箱式布局管理器中组件排列的几个重点:

❑计算最高组件的最大高度,尝试把所有的组件都增加到这个高度。如果有某些组件不能达到这个高度,那么在Y轴上对齐要通过“getAlignmentY”方法得到,该方法返回一个介于0(按顶部对齐)和1(按底部对齐)之间的浮点数。组件默认是0.5,也就是中线对齐。

❑得到每个组件的首选宽度,然后把所有的首选宽度合计起来。

❑如果首选宽度总和小于箱的宽度,那么所有的组件都会相应地延伸,直到适应这个箱子的宽度。组件从左到右排列,并且相邻两个组件之间没有多余的空格。

前面介绍过,箱式布局组件之间没有空隙,那么就要通过一个称为填充物的组件来提供空隙。箱式布局管理器提供了三种填充物:支柱、固定区、弹簧。

【实例22.15】在这里先举例,然后再针对实例进行分析。


01 import javax.swing.*;

02 import java.awt.*;

03 ///创建一个顶层框架类

04 ///WIDTH参数是指框架的宽度

05 ///HEIGHT参数是指框架的长度

06 ///setTitle用来设置框架左上角的标题

07 ///setSize用来设置框架的大小

08 ///产生不同的箱子布局管理器对象,每个对象放置不同的控件

09 public class Swingtest14

10 {

11 12

public static void main(String[]args)

13 {

14 BoxLayoutFrame frame1=new BoxLayoutFrame();

15 frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

16 frame1.show();

17 }

18 }

19 class BoxLayoutFrame extends JFrame

20 {

21 private static final int WIDTH=300;

22 private static final int HEIGHT=200;

23 public BoxLayoutFrame()

24 {

25 setTitle("箱式布局管理器");

26 setSize(WIDTH, HEIGHT);

27 Container con=getContentPane();

28 JLabel label1=new JLabel("姓名:");

29 JTextField textField1=new JTextField(10);

30 textField1.setMaximumSize(textField1.getPreferredSize());

31 Box hbox1=Box.createHorizontalBox();

32 hbox1.add(label1);

33 hbox1.add(Box.createHorizontalStrut(20));

34 hbox1.add(textField1);

35 JLabel label2=new JLabel("密码:");

36 JTextField textField2=new JTextField(10);

37 textField2.setMaximumSize(textField2.getPreferredSize());

38 Box hbox2=Box.createHorizontalBox();

39 hbox2.add(label2);

40 hbox2.add(Box.createHorizontalStrut(20));

41 hbox2.add(textField2);

42 JButton button1=new JButton("确定");

43 JButton button2=new JButton("取消");

44 Box hbox3=Box.createHorizontalBox();

45 hbox3.add(button1);

46 hbox3.add(button2);

47 Box vbox=Box.createVerticalBox();

48 vbox.add(hbox1);

49 vbox.add(hbox2);

50 vbox.add(Box.createVerticalGlue());

51 vbox.add(hbox3);

52 con.add(vbox, BorderLayout.CENTER);

53 }

54 }


【代码说明】这个程序的含义是先创建3个水平箱,再创建一个垂直箱。将3个水平箱添加到垂直箱中。

【运行效果】运行结果如图22.16所示。

在下一小节中,将介绍一种比较人性化的布局管理器:网格组布局管理器,这种布局管理器最大的好处在于,可以由用户自己来分配控件的空间位置,它结合了很多种布局管理器的优点。

22.10 复杂布局管理器的种类及用法 - 图1

图 22.16 使用箱式布局管理器