读书人

Java Swing - 学问篇 之 LayoutManager

发布时间: 2013-04-07 12:50:11 作者: rapoo

Java Swing - 常识篇 之 LayoutManager
???? 新学Swing的朋友,往往感觉到Swing的布局管理器很难使用,这里的很难使用指的是,不知道怎样才能运用各种Layout来完成一个复杂的UI界面。对于新接触的朋友,往往会过度依赖可视化工具,开始的时候可能用可视化的工具可以很好地完成各种布局,但是有没有想过以后的修改和维护。我们都知道用可视化做出来的UI,代码块是非常难懂的,十分乱。对以后的维护十分困难。所以可视化工具用来当做一个辅助的工具比较好,最好不要过度依赖它。为了解决这样一系列的问题,我们先要非常熟悉Layout,今天我会推荐一个个非常“强大、好用”的布局管理器给大家。???? 前天习总在非洲的演讲时,讲到“授人以鱼,不如授人以渔”,的确,在IT行业也是如此,教我们某样技术如何用,还不如深入了解它的工作原理。而我既要授人以渔,也要授人以鱼。这里有一篇很好的文章极力推荐给大家,http://www.blogjava.net/javagui/archive/2007/11/18/Layout.html ,它阐述了布局管理器的工作原理,写得非常好,如果各位新的学弟学妹们想学好Swing的话,就要认真消化一下,确确实实”授人以渔“。
???? 在开始之前,先来回顾一下Swing常用的布局管理器:
? 1 - ?BorderLayout :分为东、南、西、北、中心 这五个方位。北和 南的组件可以在水平方向上拉伸;而 东和 西 的组件可以在垂直方向上拉伸;中心的组件可同时在水平和垂直方向上拉伸,从而填充所有剩余空间。BorderLayout是RootPaneContainer(JInternalFrame、JDialog、JFrame、JWindow)的默认布局管理器。?? 2 - FlowLayout :该布局是从左到右,中间放置,一行放不下就换到另外一行。因此它一行能放置多少组件取决于窗口的宽度。注意它默认组件是居中对齐,可以通过FlowLayout(intalign)函数来指定对齐方式。FlowLayout是JPanel的默认的布局管理器。?3 - CardLayout:所有的组件像卡片一样叠在一起,每时每刻都只能显示一张卡片。也许对于新的朋友来说CardLayout好像没有什么用武之地。其实CardLayout常用到切换界面。想像一下,点击App的Menu之后或者某个Button之后,主界面会切换到另外一个界面,这个时候就需要CardLayout。?4 - GridLayout:网格式的布局,窗口改变的时候,组件的大小也会随之改变。每个单元格的大小一样,而且放置组件时,只能从左到右、由上到下的顺序填充,用户不能任意放置组件,比较的“死板”。所以在我的经验中基本很少用到这个Layout。?5 - GroupLayout:用NetBean的可视化编辑器来做Swing UI的朋友都知道,GroupLayout是一个非常复杂的Layout,基本如果想要自己手写,是一件很难的事情。所以除非用可视化的工具,一般不提倡用GroupLayout。?6 - GridBagLayout:可以完成复杂的布局,而且IDE对它有足够的支持,是一个很强大的Layout。不过它过于复杂,我们先看一下,它的布局约束方法: public GridBagConstraints(int gridx, int gridy,int gridwidth, int gridheight,double weightx, double weighty,int anchor, int fill,Insets insets, int ipadx, int ipady),GridBagConstraints 功能全面,内置了很多参数比如 anchor 描点,ipadx 内部填充, Weighty 指定如何分布额外的水平空间等等 所以当添加一个控件时,往往需要设置GridBagConstraints 很多参数才能达到效果,?例如
GridBagConstraints? gridBagConstraints = new java.awt.GridBagConstraints();
??????? gridBagConstraints.gridx = 1;
??????? gridBagConstraints.gridy = 1;
??????? gridBagConstraints.ipadx = 3;
??????? gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0);
??????? pnlContent.add(btn, gridBagConstraints)如果是netbeans可视化工具,这是很简单实现的,但是考虑到后期布局的模板可能会无意中修改,导致netbeans或者eclipse无法装载可视化布局,手动修改就会是很大的工作量,而且GridBagConstraints 空间各个方向量比较抽象。?? 上面总结几个常用Layout的特点,其中GridBagConstraints的功能是最强的,不过他们之间没有什么可比性,根据不同的需求选择布局更能清晰反映布局带来的便捷式与高效性。到目前为止,我们知道GridBagConstraints可以较好地完成复杂的Layout,算是"功能全面“,但是它有缺点,上面已经说到了。如果现在有一个功能强大的,而且又不复杂的Layout,我想这正是我们所想要的。下面来介绍两个功能强大,使用起来方便,而且又不复杂的两个Layout:TableLayout、MigLayout1.什么是TableLayout
???? Tablelayout是一种布局管理器。这种管理器把容器划分为行和列,就像是电子表格中的单元格。Tablelayouot把行和列交叉的每一个格子称为基本的单元格(cell)。组件被添加到容器划分好的单元格中。当容器发生改变(伸缩)时,单元格也随之伸缩,装载在单元格里的组件也相应的会进行伸缩。
???? 以下图为例:此容器被分为4行5列。由图可看出,每一列的宽度并不是固定的,也不是平均宽度的。同理每一行的高度也不是均分的,可以按照实际情况进行分配列的宽度和行的高度。
在单元格中,行和列都是从0开始计数。Row0表示第0行,col 0表示第一列。
????? 当容器发生改变时,每一行每一列都会按照一定的比例发生改变。即组件会发生大小的改变。由图可以看出,组件可以放在容易的一个cell单元格中,也可以占几个单元格。


Java Swing - 学问篇 之 LayoutManager
?
2 Tablelayout的使用在使用之前,先给出TableLayout的API:http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/javadoc/layout/TableLayout.htmlTableLayout的官网(里面有很多例子):http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/Simple.html其实学习的另外的一种重要的方法就是多去官网里面,官网的资料是十分全面。
?2.1 TableLayout行列的分配一般来说,创建tablelayout要先设定行和列。我们定义一个double类型的二维数组size[][]。
Java代码:
double size[][] ={
{100, 0.50, 0.20, TableLayout.FILL, 200, TableLayout.FILL},
{TableLayout.FILL}};在上面的代码中,size[0]中存放的是列的宽度,size[1]中存放的是行的高度;数组中的整数表示该单元格的宽度或高度为多少像素,小数表示该单元格的宽度或高度为剩余空间的百分之多少,TableLayout.FILL表示将剩余的空间填满,如果出现多个TableLayout.FILL,则这几个单元格平分剩余的空间。假设这个容器有500像素宽,则在上面的例子中:
第1列宽度为100,
第2列为(500-100-200)*0.5=40,
第3列为(500-100-200)*0.3/2=30,
第4列为200,
第5列同第3列,为30。
注意:在表示宽或高的像素时范围应该在 0至1之间,而且0.0可以表示成0%或者0个像素,而1只能表示1个像素,不能表示成100%
2.2 创建一个Tablelayout
创建tablelayout就和其他布局管理器一样,直接new一个TableLayout,然后给pannel设置布局panel.setLayout( new TableLayout(size));
2.3 为容器添加组件
使用add方法,add(组件,“坐标”),
??? add(Component comp, Object constraints)参数说明:
????Comp: the component to be added
????Constraints: an object expressing? Layout contraints for this
例如给panel添加button: panel.add(button,“0,0”);
如下图:

Java Swing - 学问篇 之 LayoutManager
?
??? 如果这个button横跨多个单元格,计算顺序是从左上到右下,则字符串的前两个放第一格的坐标,后两个行最后一格的坐标,例如,从(0,0)到(3,0),表示为:panel.add(button,”0,0,3,0”);
如下图:

Java Swing - 学问篇 之 LayoutManager
?
3.tablelayout 举例详细介绍
下图为实际列子与运行效果图

Java Swing - 学问篇 之 LayoutManager
?
?3.1 行和列的分配
???? 此container被分为三行五列。size[0]为列比列分配,width=200是指component的宽度,可以是任意值。写成35/width 不直接写成0.15是为了以后的便于修改与直观认识。
参数 p 为TableLayout.PREFERRED:指定行或者列可以根据component自身的大小给予合适的行或列比列,以能全部显示此component。
参数F为TableLayout.FILL:指示行或者列会把container剩下的的空间填满,如上第四列和第五列都为F,则表示第四和第五列会把container剩下的空间填满等分为两份,平均分给第四、第五列。
3.2 添加组件
?? this.add(new JButton("0,0"),"0,0")中constraints为“0,0”两个参数,表示只占0行0列
?? this.add(new JButton("3,0,3,1"),"3,0,3,1")中constraints为“3,0,3,1”四个参数,表示此component在container中的占用cell为从“3,0”跨度到“3,1”。跨度的方向为左上角到右下角围成的矩形
??? Tablelayout就说到这里,这里只是说明一下TableLayout的基本的用法,要深入了解TableLayout,可以去官网里面下载。由于IDE,不支持TableLayout,所以这里我会提供一个方便的开发小工具(以前的同事做的),专门针对TableLayout的小工具,十分好用。在附件中。这里总结一下TableLayout优缺点:优点:
(1)、虽然Tablelayout它不是JDK自带的,但是它是开源的。Tablelaout作为开源的布局框架,可以对核心的类TableLayout.java进行修改达到自己所需要的功能实现。Tablelayout布局与html中表格基本是一样的,我们可以任意而且轻易地合并单元格,可以完成很复杂的布局。
?(2)、当窗口的大小发生改变时,在tableLayout布局下得组件也会自动改变,按%比来分配每行,每列的大小。
(3)、TableLayout简单明了,不需要过多设置属性值,也能布局到复杂的外观,而不像GridBagLayout那样需要设置很多的属性(gridx、gridy、insets等等)过于复杂。缺点:Tablelaout作为第三方的开源框架,要试用它则必须引入tablelayout的功能jar包,如果只要实现tablelayout简单的功能则只需要引入tablelayout相关的几个类就可以。Tablelayout没有可视化的界面可以设计,不像其它jdk提供的布局在netbeans或者eclipse装入插件后有可视化的编辑界面。

读书人网 >编程

热点推荐