前言

在编写图形界面时,总是需要考虑的就是组件放在哪里,组件怎么大才合适。在Swing中就有现成的布局管理器帮我们做这些事情,我们不必写代码去一一安排。下面将介绍什么是布局管理器、Swing中常用布局管理器分类以及特点。

布局管理器

什么是布局管理器?

组件在容器中的位置和大小是由布局管理器来决定的。每一个容器都会使用一个布局管理器,通过它来自动进行组件的布局管理。

布局管理器的工作过程

不同的布局管理器对容器中的组件布局会依据不同的算法,如何布局是布局管理器中的定位组件负责。它会根据容器中的每一个组件需要多少空间,然后依据所用平台的组件尺寸、可用空间,以及布局管理器的规则在屏幕上尽最好可能来安排组件;在不同的平台和屏幕上,也会自动地调节组件的相对位置和大小。
要具体确定组件需要多少空间,布局管理器会调用组件的getMinimumSize()、getPreferredSize()以及getMaximumSize()方法获取组件显示所需要的最小,适当,以及最大空间。布局管理器使用组件的空间需求来调整组件尺寸并在屏幕上进行安排。

在一些情况下,也会忽略一些组件,比如使用BorderLayout时,容器的只有南北东西中五个方位可以放置组件,其中一个方位若有多个组件则只会显示最后一个组件。

布局管理器的特点

前面介绍过Swing中的布局管理器大多数是沿袭自AWT中,AWT中的布局管理器的特点主要有:

  • 具有跨平台,会依据平台有不同的呈现。

  • 不需要用户指定组件的位置和大小,布局管理器会自动决定最佳位置和大小

  • 组件会跟着容器大小变化而自适应发生变化

  • 每个容器都有自己的默认布局管理器

  • 每个容器可以通过setLayout()方法来指定布局管理器。或不想使用任何布局管理器则使用setLayout(null)

    使用绝对布局,自己指定组件的位置。

布局管理器的种类

AWT为容器提供了5种常用的布局管理器:FlowLayoutBorderLayoutGridLayoutGridBagLayoutCardLayout 并且Swing提供了另外一种布局管理器:BoxLayout

null布局管理器

还有一种布局就是空布局,当设置setLayout(null)时,就是采用空布局管理器,此时各个组件的位置和大小就需要自行制定。

FlowLayout

将组件从左到右(从上到下)的顺序依次排列加入到Component,在遇到边界时,从下一行的开头继续排列。

构造函数:

  • FlowLayout(): 默认构造函数,默认构造函数使用CENTER对其,hgap和vgap均为5
  • FlowLayout(int align): 指定对其方式,LEFT, RIGHT, CENTER, LEADING, TRAILING
  • FlowLayout(int align, int hgap, int vgap): 可以指定水平和垂直间距

Panel容器默认使用FlowLayout布局管理器

BorderLayout

BorderLayout把容器位置分为5个方位:CENTER,EAST,WEST,NORTH,SOUTH。在向使用BorderLayout布局的容器中添加组件时,若不指定位置,会将组件默认添加在CENTER位置。

构造函数:

  • BorderLayout(): 默认构造函数,组件之间没有间隔
  • BorderLayout(int hgap, int vgap):可以指定组件之间的水平和垂直间距

Frame、Window和ScrollPane默认使用BorderLayout布局

需要注意:可以向使用BorderLayout的容器的任何一个方位添加多个Component,但是只会显示最后添加的那个。不过,我们可以使用Panel组合多个Component,实现复杂的布局。

Box

Box是一个容器,不是一个布局管理器,但是通常用它来做布局管理器的工作。它可以实现让组件水平或者垂直放置。Box通常使用其Box.createHorizontalBox()或者Box.createVerticalBox()静态方法创建。常与Panel组合使用。

BoxLayout

通过参数 X_AXIS、Y_AXIS 来决定控件是进行水平还是垂直排列布局。BoxLayout 的构造函数有两个参数,一个参数定义使用该 BoxLayout 的容器,另一个参数是指定 BoxLayout 是采用水平还是垂直排列。

 JPanel panel=new JPanel();
BoxLayout layout=new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(layoout);

GridLayout

按照构造函数中提供的参数,将整个容器分为大小相等的网格状。当往使用GridLayout布局的容器中添加Component时,以从上到下,从左到右的方式添加。

与FlowLayout的区别:

  • GridLayout中的Component自动占用某个网格,而FlowLayout中的Component可以按自己的大小占用不同的空间
  • GridLayout中每行的Component数量相同,而FlowLayout中每行中Component的数量可能不同

构造函数:

  • GridLayout(): 默认构造函数,创建一个只有一行一列的网格
  • GridLayout(int rows, int cols):创建rows行cols列的网格
  • GridLayout(int rows, int cols, int hgap, int vgap):也可以指定网格之间的间距

GridBagLayout

GridBagLayout管理器可以说是最强大的布局管理器。和GridLayout类似,GridBagLayout也将容器分为很多网格。与GridLayout不同:GridBagLayout的网格数量不是由构造函数决定的;可以让Component跨越多个Grid;可以使每个Grid大小不同;当窗口大小发生变化时,GridBagLayout可以精确地控制每个Grid的拉伸变化。

每个Component被添加进GridBagLayout时,需要和一个GridBagConstraints对象绑定在一起,确定其位置以及一些其他属性。Component被添加进GridBagLayout的函数是:setConstraints(Component c , GridBagConstraints constraints)

所以使用好GridBagLayout主要是要使用好GridBagConstraints!

GridBagConstraints

GridBagConstraints是控制容器中某个Component的布局特性。使用GridBagConstraints的关键在于精确地设置其属性值:

  • gridx和gridy: 设置Component在网格中的横向和纵向位置
  • gridwidth和gridheight:设置Component能在横向和纵向横跨多少个网格
  • fill:控制Component如何填充网格的区域
    • NONE、HORIZONTAL 、VERTICAL 、BOTH
  • ipadx和ipady:设置Component的内部填充大小,即在Component的最小大小上还需要加多少
  • insets:外部填充大小,类似于Border
  • weightx和weighty:设置在横向和纵向的占用比重,当窗口大小改变的时候,可以使用这两个属性来控制Component随着窗口变化时,Component大小的变化比率。两个属性的默认值为0,取值范围[0.0, 1.0]。

CardLayout

一种三维的布局管理器,除了容器的高和宽之外,还加入了第三个维度。就像扑克堆起来一样,只显示最上面一张卡片(Component),可以通过方法切换当前显示的卡片(默认显示第一张)。

构造函数:

  • CardLayout()
  • CardLayout(int hgap, int vgap):

主要方法:

  • first(Container target)
  • last(Container target)
  • previous(Container targe)
  • next(Container target)
  • show(Container target, String name)

小结

没有详细去介绍每个布局管理器如何使用,都只是简单介绍一个概念。如何使用网上已有很好的教程以及查看API文档也是不错的方式。记下这些更多的相当于是一个笔记吧,作为教程是非常欠缺的,方便自己日后回顾。
一般来说,Java本身提供的布局管理器几乎可以满足我们的大部分需求了,我们只用按需取材。布局搞好了,但是这只是一个可视化的静态界面,还没有实现与用户的交互。要实现与用户交互则需要事件处理。下一篇文章将介绍事件处理的相关基础。

参考:https://blog.csdn.net/shishuinancheng/article/details/9305369

Swing——布局管理器的更多相关文章

  1. 编写Java程序,使用Swing布局管理器和常用控件,实现仿QQ登录界面

    返回本章节 返回作业目录 需求说明: 使用Swing布局管理器和常用控件,实现仿QQ登录界面 实现思路: 创建登录界面的类QQLogin,该类继承父类JFrame,在该类中创建无参数的构造方法,在构造 ...

  2. 编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面

    返回本章节 返回作业目录 需求说明: 使用Swing布局管理器与常用控件,实现用户登录界面 实现思路: 创建用户登录界面的类LoginFrame,在该类中创建无参数的构造方法,在构造方法中,设置窗体大 ...

  3. Swing布局管理器介绍

    创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...

  4. Swing布局管理器

    在Swing中使用的所有布局管理器都可以实现LayoutManager接口.Swing中有五种常见的布局管理器分别为FlowLayout.BorderLayout.GridLayout.CardLay ...

  5. Java Swing布局管理器GridBagLayout的使用示例 [转]

    GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的, GridBagLayout 类是一个灵活的布局管理器,它不要求 ...

  6. 5、Java Swing布局管理器(FlowLayout、BorderLayout、CardLayout、BoxLayout、GirdBagLayout 和 GirdLayout)

    5.Java-Swing常用布局管理器       应用布局管理器都属于相对布局,各组件位置可随界面大小而相应改变,不变的只是其相对位置,布局管理器比较难以控制,一般只在界面大小需要改是才用,但即使这 ...

  7. Java Swing 第03记 布局管理器

    几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...

  8. (转)Java 的swing.GroupLayout布局管理器的使用方法和实例

    摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...

  9. Java 的swing.GroupLayout布局管理器的使用方法和实例(转)

    The following builds a panel consisting of two labels in one column, followed by two textfields in t ...

随机推荐

  1. Day08 (黑客成长日记) 命名空间和作用域

    Day08:命名空间和作用域: 1.命名空间: (1)内置命名空间(python解释器): 就是python解释器一旦启动就可以使用的名字储存在内置命名空间中: eg: len() print() a ...

  2. eclipse中设置python的版本

    (mac系统)由于系统的python是内置的,无法直接查找到安装文件,则可在eclipse偏好设置-PyDev - Interpreters-Python Interpreter其右边选择Quick ...

  3. OpenCV3.30 画图函数

    画图函数(Draw Functions)都放在imgpro. 例如C++中用: #include <opencv2\imgproc.hpp>

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. Shell文本操作-5

  6. pyqt5安装问题

    最近装了下pyqt5,遇到了很多坑,要么是模块没找到,要么是各种ddl出错什么的 后来查了一下,总结一下: 1.pyqt5和python的版本一定匹配,尤其是自己去网上下的pyqt一定要注意适配的版本 ...

  7. Navicat连接oracle库报错的处理方法

    1.oracle客户端版本:11.2.0  64X navicat premium客户端:12.0. 64X 2.安装后,打开连接,输入连接信息,点击保存,提示oracle library is no ...

  8. prim最小生成树

    prim和DIjkstra相似,都使用了贪心策略,加一些限制条件. prim每次会找出尽量小的那个边,将其加入到树中,最终使得生成树长大. 树中有n-1个节点时或者剩下的所有边都是INF,算法结束. ...

  9. day_9内存管理

    复习 '''文件处理​1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...

  10. #Java学习之路——基础阶段(第二篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...