`

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、MigLayout
1.什么是TableLayout
     Tablelayout是一种布局管理器。这种管理器把容器划分为行和列,就像是电子表格中的单元格。Tablelayouot把行和列交叉的每一个格子称为基本的单元格(cell)。组件被添加到容器划分好的单元格中。当容器发生改变(伸缩)时,单元格也随之伸缩,装载在单元格里的组件也相应的会进行伸缩。
     以下图为例:此容器被分为4行5列。由图可看出,每一列的宽度并不是固定的,也不是平均宽度的。同理每一行的高度也不是均分的,可以按照实际情况进行分配列的宽度和行的高度。
在单元格中,行和列都是从0开始计数。Row0表示第0行,col 0表示第一列。
      当容器发生改变时,每一行每一列都会按照一定的比例发生改变。即组件会发生大小的改变。由图可以看出,组件可以放在容易的一个cell单元格中,也可以占几个单元格。



 
2 Tablelayout的使用
TableLayout的官网(里面有很多例子):
其实学习的另外的一种重要的方法就是多去官网里面,官网的资料是十分全面。
 
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”);
如下图:


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



 
3.tablelayout 举例详细介绍
下图为实际列子与运行效果图


 
 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装入插件后有可视化的编辑界面。
  • 大小: 23.9 KB
  • 大小: 40.5 KB
  • 大小: 37.4 KB
  • 大小: 266.5 KB
分享到:
评论

相关推荐

    Java Swing - 常识篇 之 LayoutManager 03

    本篇文章将深入探讨Java Swing中的LayoutManager,并以实际案例进行解析。 在Swing中,每个容器(如JFrame、JPanel等)都有一个内置的LayoutManager,它决定了容器内组件的布局。默认的布局管理器可能并不符合所有...

    Java-Swing-exercises.rar_java 控件

    Java Swing是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件和工具,用于构建桌面应用程序。这个"Java-Swing-exercises.rar"压缩包显然包含了作者在大学期间编写的Swing控件练习,旨在帮助学习者熟悉并...

    java swing漂亮界面(超酷) javaswing教程

    文档"javaswing教程.doc"应该包含了详细的步骤、实例代码以及最佳实践,帮助你深入理解和掌握Java Swing的界面设计技巧。 总之,Java Swing不仅是一个强大的工具集,也是开发者实现桌面应用创新设计的关键。通过这...

    基于Java的实例开发源码-swing-explorer(Swing开发辅助工具).zip

    Swing Explorer是一款基于Java Swing库开发的辅助工具,旨在帮助开发者更轻松地理解和调试Swing应用程序。这个压缩包包含了Swing Explorer的完整源代码,为Java开发者提供了一个深入学习Swing组件和布局管理器的实践...

    javaswing详解

    本篇文章将深入讲解Java Swing的基础知识、核心组件、事件处理以及实际案例应用。 一、Java Swing基础知识 1. 轻量级与重量级组件:Swing组件是轻量级的,基于Java的AWT(Abstract Window Toolkit)组件,比AWT...

    javaswing组件大全.pdf

    BorderLayout 是 Java Swing 中的一个布局管理器,继承自 java.awt.LayoutManager 类。BorderLayout 提供了一个基本的布局管理,可以用来布局组件。在上面的代码中,我们可以看到 BorderLayout 的使用,实现了一个...

    java swing 工具箱

    本篇将深入探讨Java Swing工具箱中的关键概念和技术。 首先,Swing 提供了大量组件(JComponents),这些组件用于构建用户界面,例如按钮(JButton)、文本框(JTextField)、列表(JList)、表格(JTable)和面板...

    Java Swing 组件全演示

    Java Swing 是Java GUI(图形用户界面)库的一部分,用于构建桌面应用程序。它提供了丰富的组件集合,使得开发者可以创建复杂的、交互式的用户界面。在Java Swing组件全演示中,我们将深入探讨Swing的核心概念、组件...

    java swing实时时钟

    Java Swing 是Java平台上的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。本项目"java swing实时时钟"是一个基于Swing的简单应用,旨在帮助初学者理解如何在Java...

    深入浅出Java Swing程序设计_11394260.rar

    Java Swing是Java GUI(图形用户界面)开发的重要库,它属于Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。本资源"深入浅出Java Swing程序设计_11394260.rar"显然是一个关于Java Swing编程的详细...

    Java编程-中级界面篇

    在Java编程领域,中级界面篇通常涉及的是图形用户界面(GUI)的设计与开发。Java提供了丰富的库和工具来创建美观且功能强大的用户界面,其中最常用的就是Java Swing和JavaFX。下面将详细介绍这两个库以及相关的知识...

    java Swing(容器,简单控件,布局管理器)

    ### Java Swing 概述 Java Swing 是 Java 平台中用于构建图形用户界面(GUI)的一个强大库。它是在 Java 2.0 版本中引入的,作为对早期 Java AWT(Abstract Window Toolkit)库的增强和扩展。Swing 的主要优势在于...

    JAVA图形编程(AWT+SWING)

    本资源包主要涵盖了两个核心库:AWT(Abstract Window Toolkit)和Swing,它们都是Java Foundation Classes (JFC) 的一部分,用于构建桌面应用程序。 **AWT** 是Java早期提供的图形用户界面(GUI)工具包,它直接与...

    Java应用程序-日记本

    Java应用程序-日记本是一款基于Java Swing开发的桌面应用,它为用户提供了一个集日记书写、截图和音乐播放功能于一体的平台。Swing是Java Standard Edition (Java SE)的一部分,用于构建图形用户界面(GUI)的库,...

    java swing(影印版)

    Java Swing 是Java GUI编程的重要部分,它提供了丰富的组件和功能,使得开发者能够创建美观且功能齐全的桌面应用程序。本资源“java swing(影印版)”是一部针对Java Swing的学习教材,旨在帮助学习者掌握Swing的...

    java swing LayerTest

    Java Swing 是Java GUI(图形用户界面)开发的一个重要库,它是Java AWT(抽象窗口工具包)的扩展,提供了更多丰富的组件和功能。在Swing中,`JPanel`是常用的一种容器组件,用于组合其他组件,实现复杂的用户界面。...

Global site tag (gtag.js) - Google Analytics