在本次教程中,偶讲一下在JDK组件布局管理器的使用方法。在JAVA中一共有7种布局方式:流式布局,网格布局,边界布局,卡面布局,网格包布局,盒式布局,自定义布局,它们是AWT包提供的。
布局管理器
·流式布局(FlowLayout)是JAVA小应用程序默认的布局管理方式,它是按组件加入容器的次序,按行一个按一个放置组件,当组件达到Applet右边界时,它就在下一行开始放置组件。在缺省状态下,FlowLayout管理器使组件对准每一行的中心。
·网络布局(GridLayout)是最简单的布局管理器,它把容器分成所需要的矩形网格,然后把你创建的组件放入每个格式,从左到右,自上向下的放置。
·边界布局(BorderLayout)管理器让你按东,南,西,北,中的方向来安置组件。
·卡片布局(CardLayout)管理器是创建如卡面盒之类的布局盒,然后从一种布局翻动到另一种布局。它形象的模拟了现实生活某些实例,如一个盒子里放置了许多东西,假设盒子只有一个口,那么你永远只能看到最上面的物件,只有当你拿走上面的物件后,下面的物件才会显示出来。就这样一层一层往下翻动,如此循环不休,一层一层的往下翻。
·盒式布局(BoxLayout)管理器跟卡面布局有些相似,不过它允许你在容器中水平或垂直的、并排的安排多个组件。
·网格包型(GridBagLayout)布局管理器是AWT提供的最灵活,最复杂,最常用的布局管理器之一,类似于网格布局,但它允许你把组件放在网格中任何行或列,也允许你的组件跨多行或多列。它是通过设置GridBagConstraints对象中的变量来约束组件布局的。
·自定义布局(null)管理器是通过组件本身的setBounds()方法来设置组件在容器中的位置,是最常用的布局管理器之一,相对于网格包型而言,还是非常简单的,只不过需要计算每个组件大小以及容器位置。
对于上面7种布局,偶不可能一一举例,那就以最常用的下面两种布局方式来跟大家介绍一下布局管理器,首先是网格包型。
网格包型布局方式,就是通过设置GridBagConstraints对象中的一些参数来达到有序的安排组件的效果,GridBagConstraints有:gridwidth,gridheight,anchor,fill,gridx,gridy,weightx,weighty等属性,通过给这些赋不同的值来改变组件排放位置。
gridwidth,gridheight指出组件的大小等它显示区域的大小,缺省值为1,可以修改这两个值来扩大组件的显示区域。但要注意的是,如果显示区域区域大小增加了,组件本身的大小是不会增加的。
anchor属性是显示区域内确定放置组件位置。其有效值为东,南,西,北,中,东南,东北,西南,西北,默认为中。
fill表示当组件小于它的显示区域时,设置它的填充方式。缺省为NONE(空),可以选择HORIZONTAL(水平)、VERTICAL(垂直)和BOTH。
gridx,gridy为放置组件的网格行与列。对于网格最左边为0列,最顶部为0行。
weightx,weighty决定组件是否需要拉伸以水平(weightx)或垂直(weighty)填入显示区域,缺省都为0。
下面我们把连载二中的小应用程序改一下,使它能按我们通过网格包型布局管理方式,设置排列方式:
import javax.swing.*; //导入Swing包,否则无法使用下面组件
public class AcceptData extends JApplet //通过关键字extends继承小应用程序类
{
static JPanel panelObj; //定义面板,用于放置组件
//定义标签,用于提示客户输入信息
JLabel lblCustName;
JLabel lblCustCellNo;
JLabel lblCustCountry;
JLabel lblCustAge;
//定义文本编辑框,用于接收客户输入
JTextField txtCustName;
JTextField txtCustCellNo;
JTextField txtCustAge;
//定义组合框,提供可选择的选项
JComboBox cboCustCountry;
GridBagLayout gbObject; //定义布局管理器对象
GridBagConstraints gbc; //定义网格包型约束方式
public void init() //通过构造方法初始化组件
{
gbObject=new GridBagLayout();
gbc=new GridBagConstraints();
panelObj=new JPanel();
getContentPane().add(panelObj); // 把面板加入到框架中
//初始化标签
lblCustName=new JLabel("客户名字: ");
lblCustCellNo=new JLabel("电话号码: ");
lblCustCountry=new JLabel("客户国籍: ");
lblCustAge=new JLabel("客户年龄: ");
//初始化编辑框
txtCustName=new JTextField(12);
txtCustCellNo=new JTextField(12);
txtCustAge=new JTextField(2);
//初始化组合框
String strCountry[]={"China","U.S.A."};
cboCustCountry=new JComboBox(strCountry);
//将组件通过布局管理器设置后添加到面板上
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.gridx=1;
gbc.gridy=5;
gbObject.setConstraints(labelCustName,gbc);
panelObject.add(labelCustName);
gbc.gridx=4;
gbObject.setConstraints(textCustName,gbc);
panelObject.add(textCustName);
gbc.gridx=1;
gbc.gridy=8;
gbObject.setConstraints(labelCustCellNo,gbc);
panelObject.add(labelCustCellNo);
gbc.gridx=4;
gbObject.setConstraints(textCustCellNo,gbc);
panelObject.add(textCustCellNo);
gbc.gridx=1;
gbc.gridy=11;
gbObject.setConstraints(labelCustPackage,gbc);
panelObject.add(labelCustPackage);
gbc.gridx=4;
gbObject.setConstraints(comboCustPackage,gbc);
panelObject.add(comboCustPackage);
gbc.gridx=1;
gbc.gridy=14;
gbObject.setConstraints(labelCustAge,gbc);
panelObject.add(labelCustAge);
gbc.gridx=4;
gbObject.setConstraints(textCustAge,gbc);
panelObject.add(textCustAge,gbc);
}
}
行了,到这里大家就可以编译运行了,请注意了这是小应用程序,还要编写一个网页文件来把它嵌入才可以运行哦!
下面我来介绍另一种布局最常用的布局管理器——自定义布局:
大部分组件都有一个setBounds(int,int,int,int)属性,它有4个参数,分别表示组件在窗口中的位置与大小。比如我们建立一个按钮button,需要它在50行,60列位置显示,它的长为80,宽为30,那么就用button.setBounds(50,60,80,30)就OK啦!是不是很简单呢?这种方式相对于网格包来简单不少,但需要计算组件在窗口中的位置也是一件比较麻烦的事,不过别怕,我们是为了学习才这么做的,以后设计程序时,完成可以用可视化来完成的!
本次连载就简单的介绍了一下布局管理器的应用了,下回我们来讲事件处理。