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.16 使用箱式布局管理器