BoxLayout的类层次结构图:
java.lang.Object --java.awt.BoxLayout
BoxLayout提供了两个常数X_AXIS,Y_AXIS来表示水平或垂直排列。若放进去的组件不等高,则系统将会使所有的组件与最高组件 等高,还有,若你将组件都摆在同一行时,系统不因组件宽度在于Container的宽度,而使组件自动摆在下一行,你必须自行处理换 行的操作。
构造函数:
BoxLayout(Container targe,int axis)建立一个水平或垂直的BoxLayout.
讲到BoxLayout,我们就不得不提到Box这个Container,Box这个Container默认的Layout为BoxLayout,而它只能使用这个Layout, 否则编译时会有Error产生,如同前面所讲的,BoxLayout是以水平或垂直方式排列,因此,当我们要产生一个Box Container时, 就必须指定它的排列方式,下面为Box的构造函数:
Box(int axis) 建立一个Box Container,并指定组件的排列方式是水平或垂直。
上面的axis参数,我们可以使用BoxLayout.X_AXIS或BoxLayout.Y_AXIS来指定。或是利用Box类所提供的两个方法:
createHorizontalBox()与createVerticalBox(),来建立BoxContainer.
Box类提供4种透明的组件来做更方便的版面管理。分别是glue、strut、rigid、filler:
下面以两个相连的按钮当例子,起始状态如下:
B1.java
1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 public class B1{ 5 public B1(){ 6 JFrame f=new JFrame(); 7 Container contentPane=f.getContentPane(); 8 Box baseBox=Box.createHorizontalBox(); 9 contentPane.add(baseBox); 10 baseBox.add(new JButton("A")); 11 baseBox.add(new JButton("B")); 12 f.setTitle("BoxLayout"); 13 f.setSize(new Dimension(200,50)); 14 f.setVisible(true); 15 f.addWindowListener( 16 new WindowAdapter(){ 17 public void windowClosing(WindowEvent e){ 18 System.exit(0); 19 } 20 } 21 ); 22 } public static void main(String[] args){ B1 b=new B1(); } }
Glue:当glue插入在两组件间时,它会将两组件挤到最左与最右(或最上与最下),透明的glue将会占满整个中间的空间。
例:
在10与11行间加入下面一行程序:
baseBox.add(Box.createHorizontalGlue());
Strut:当你不想将A与B按钮挤到最旁边时,你可以使用Strut组件,来设置所需要的大小,但仅能限定一维的大小,例如限定 水平或垂直高度。
例:在10与11行间加入下面一行程序:
baseBox.add(Box.createHorizontalStrut(50));//A,B之间间隔50个像素。
Rigid:这个透明组件跟Strut很像,但它可以设置二维的限制,也就是可以设置水平与垂直的限制宽度。
例:在10与11行间加入下面一行程序:
baseBox.add(Box.createRigidArea(new Dimension(50,50)));
为了将Rigid的高度功能显示出来,因此以pack()方法代替setSize()方法,11行替换为:f.pack();
若我们将高度再拉长,例如baseBox.add(Box.createRigidArea(new Dimension(50,50)));的Dimension改成(50,100),则两 组件的上下空白将会增大,因为透明的Rigid组件高度增高了。
Filler:Filler是Box的inner class,它的功能跟Rigid很像,都可以指定长宽的大小限制,且Filler可以指定最大、较佳、最小的长 宽大小,以下是Filler的构造函数:
Box.Filler(Dimension min,Dimension pref Dimension max)建立一个指定大小的Filler对象。
参数min表示最小的显示区域大小,如同上面的例子所示,若所设置最小区域的高度大于按钮A与B的高度,则按钮A与B的上方 与下方将有空白出现。
pref表示较佳的显示区域大小。max表示最大的显示区域大小。
例:在10与11行间加入下面一行程序:
baseBox.add(new Box.Filler(new Dimension(50,50), new Dimension(100,50), new Dimension(200,50)));
Box类所提供的方法:
Static Component createGlue()构造一个Glue组件可向水平与垂直方向延伸 Static Box createHorizontalBox()构造一个水平排列的Box组件 Static Component createHorizontalGlue()构造一个水平的Glue组件 Static Component createHorizontalStrut(int width)构造一个水平的Strut组件 Static Component createRigidArea(Dimension d)构造一个Rigid组件 Static Box createVerticalBox()构造一个垂直排列的Box组件 Static Component createVerticalGlue()构造一个垂直的Glue组件 Static Component createVerticalStrut(int height)构造一个垂直的Strut组件 AccessibleContext getAccessibleContext()取得与JComponent相关边的AccessibleContext Void setLayout(LayoutManager l)丢出AWTError,因为Box只能使用BoxLayout
例子:BoxLayoutDemo.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BoxLayoutDemo { public BoxLayoutDemo() { JFrame f = new JFrame(); Container contentPane = f.getContentPane(); Box baseBox = Box.createHorizontalBox();// 先产生水平排列方式的Box组件,当作基底容器(BaseBox) contentPane.add(baseBox); /* * 产生垂直排列方式的Box组件来安置第一与第三个按钮 */ Box vBox = Box.createVerticalBox(); JButton b = new JButton("first"); vBox.add(b); b = new JButton("third"); b.setMaximumSize(new Dimension(100, 150)); vBox.add(b); baseBox.add(vBox); /* * 产生垂直排列方式的Box组件来安置第二与另一个水平排列方式的Box组件 */ Box vBox1 = Box.createVerticalBox(); baseBox.add(vBox1); b = new JButton("second"); b.setAlignmentX(Component.CENTER_ALIGNMENT); b.setMaximumSize(new Dimension(300, 50)); vBox1.add(b); Box hBox = Box.createHorizontalBox(); vBox1.add(hBox); /* * 将第四与最后一个按钮加入水平排列方式的Box组件中 */ Box vBox2 = Box.createVerticalBox(); vBox2.add(Box.createVerticalStrut(50)); vBox2.add(new JButton("fourth")); vBox2.add(Box.createVerticalStrut(50)); hBox.add(vBox2); Box vBox3 = Box.createVerticalBox(); vBox3.add(Box.createVerticalGlue()); vBox3.add(new JButton("THis is the last button")); hBox.add(vBox3); f.setTitle("BoxLayout"); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { BoxLayoutDemo b = new BoxLayoutDemo(); } }