GridBagLayout

GridBagLayout用法

前言

使用Swing进行Java的GUI编程,其中一个难点就是页面布局。弄好了页面布局,就像是跨越了一个初级的里程碑。我主要是从事B/S的系统开发,基于新的应用需要,现在才来补一回Swing,一些简单的布局不想多说,只是看到一个比较实用,而且比起那些简单的布局复杂一点的GridBagLayout来说一下。作为自己的笔记,也希望当作和想学习此局布的朋友的谈资。

指定约束(constrains)

比起其它的布局,GridBagLayout多了一个约束的概念。可以这样理解,由于GridBagLayout对于内部的单元格的定制性很强,所以,此布局需要设置很多属性,而这些属性就被抽象成为GridBagConstraints对象。由此,只是需要搞清楚GridBagConstraints控制哪些属性,和GridBagConstraints如何作用于布局内的单元格。那么,这个布局可以说是差不多了。

作为补允,贴出一段典型代码:

JPanel pane = new JPanel(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

//对于每一个需要添加到容器中的组件进行如下操作:

//...创建需要的组件...

//...设置GridBagConstraints实例的实例变量...

pane.add(theComponent, c);

从上面的代码可见,其实同一个GridBagConstrains实例(这里是实例变量c),可以同时作用于多个布局内的组件,有的资料上建议不要使用单个约束实例,因为担心忘记将某些值设回来而出现一个很难查觉的bug。这是有道理的,但对于熟练一些的朋友,使用单个约束实例也未尝不可。

GridBagConstrains的实例变量

前面提过GridBagLayout通过属性控制布局内的每个单元格,而这些属性就是GridBagConstrains的实例变量。下面详解每一个实例变量的含义(以下是基于从左到右组织组件方向):

gridx,gridy

指定组件左上角的行和列,最左边的列是gridx=0,最上边的行是gridy=0。实际上就是从(0, 0)开始的坐标。GridBagConstrains.RELATIVE,是这两个实例变量的默认值,它表示的意思是,将正要添加的组件,放在上一个被添加的组件的右边或者下边其中之一(实际就是紧贴上一组件)。有资料建议,对于每一个组件,都重新设置gridx和gridy,而不是使用默认的GridBagConstrains.RELATIVE,我十分同意这种做法,因为得出的结果与预期的偏差减少。

gridwidth,gridheight

分别指定组件显示区域的行数和列数。默认是1。GridBagConstrains.REMAINDER指组件是此行(gridwidth为此值时),此列(gridheight为此值时)的最后一个组件,就是包含此行/列中所有剩下的单元格。GridBagConstrains.RELATIVE表示当前的组件占用上一个被添加的组件的下一行/列。对于这两个属性,也有和前两个属性相同的使用建议,使结果减少偏差。

注意:只有当组件是最左边的组件或者组件被指定正值的gridx和gridy时,才能使组件跨越多行。

fill

当组件所在的单元格比组件显示所需的区域大时,fill实例变量控制组件是否/怎样重设组件的大小。有效的GridBagConstrains常量有四个,分别是:NONE – 默认值,表示水平和垂直都不扩展。HORIZONTAL – 表示组件水平填满它所在的单元格,垂直方向不扩展。VERTICAL – 表示组件垂直方法填满所在的单元格,水平方向不扩展。BOTH – 表示水平/垂直方向都填满所在的单元格。

ipadx,ipady

指定组件的内容填充空间。默认值是0。组件的宽的最小值将会是,组件的宽的最小值加上2*ipadx个像数点,乘以2是因为垂直方向上有两条边。组件的长也是同样的计算方法。

insets

指定组件的外填充空间——组件和显示单元格边缘的最小空间。此值通过Inset对象指定,默认是没有外填充空间。

anchor

锚(anchor)用于当组件比它所在的显示单元格小的时候,决定组件在单元格内放置的位置。有效的GridBagConstrains常量是:CENTER (默认),PAGE_START,PAGE_END,LINE_START,LINE_END,FIRST_LINE_START,FIRST_LINE_END,LAST_LINE_END和LAST_LINE_START。

以下是一个页面以组件方向从左向右组件的示图:

-------------------------------------------------
|FIRST_LINE_START   PAGE_START     FIRST_LINE_END|
|                                                |
|                                                |
|LINE_START           CENTER             LINE_END|
|                                                |
|                                                |
|LAST_LINE_START     PAGE_END       LAST_LINE_END|
-------------------------------------------------

weightx,weighty

指定份量(weight),可以显著地影响GridBagLayout所管理的组件的外观。份量用来决定在行(weighty)与列(weighty)它们各自之间如何分配空间。这在改变面板大小时十分重要。

除非你为weightx和weighty指定最少一个非0值,否则,所有的组件会在聚在它们所在的容器的中间。这是因为当份量的值是0.0(默认)时,会将额外的空间放到单元格之间和容器的边缘。

一般地,份量的值被指定为0.0到1.0,中间的数字按需要进行设置。更大的数字表示组件的行/列应获得更多的空间。对于每一列,份量与该列中被指定最大weightx的组件相关,而每一个多列的组件的份量,会以某一方式将分量分配到组件所在的各列中。行的情况与列类似。多出的空间一般会被放置在最右边的列和最下边的行。

时间: 2024-10-26 18:47:19

GridBagLayout的相关文章

GridBagLayout占多行效果注意

如果想要出现按钮2占两行的效果,必须按键3.按钮4同时存在且同时可见. 如果缺少按钮4,则按钮2不会占两行: 如果缺少按钮3.4,则按钮2也不会占两行. 1 package com.wst.bj; 2 3 import java.awt.GridBagConstraints; 4 import java.awt.GridBagLayout; 5 6 import javax.swing.JButton; 7 import javax.swing.JFrame; 8 9 class GridBag

Java 的布局管理器GridBagLayout的使用方法(转)

GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的, GridBagLayout 类是一个灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直.水平或沿它们的基线对齐. 每个 GridBagLayout 对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,该单元被称为显示区域. 下面就通过一个记事本案例去说明GridBagLayout的使用方法. 分析: 带有箭头的说明可以拉伸的. 4占用4个格

Java FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout布局管理器

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40985027 一.FlowLayout布局管理器 FlowLayout() 构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位. FlowLayout(int align) 构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位. FlowLayout(int align, int hgap, int

GridBagLayout练习

摘自http://blog.csdn.net/qq_18989901/article/details/52403737  GridBagLayout的用法 GridBagLayout是面板设计中最复杂的布局工具,当然用的好的话也是最方便的. 本文主要通过设计一个计算器界面的方式,来学习GridBagLayout的使用.最终的效果如下图所示: GridBagLayout其组件的摆放都是有GridBagConstraints控制的.可以将需要设计的界面划分成许多个纵横的小网格,每个网格里面最多放置一

GridBagLayout布局管理器应用详解

http://yyzjava.iteye.com/blog/1181552 很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够自由改变一个程序界面的大小,通过托拽生成的界面往往是不提供这个功能的,因为定制的界面一旦改变形状,组件间的布局会变得杂乱无章. Java中的布局管理器应用了策略者模式(Strategy),为不同类型的组件布局提供了很好的模型

javax.Swing 使用GridBagLayout的程序栗子

摘自https://zhidao.baidu.com/question/110748776.html javax.Swing 使用GridBagLayout的程序栗子 总共两个文件,第一个是启动文件,第二个是一个基础面板类 1 package com; 2 3 import com.ren.BasePanel; 4 import javax.swing.*; 5 import java.awt.BorderLayout; 6 import java.awt.Toolkit; 7 8 public

GridBagLayout布局

Java,Swing用户界面中,使用GridBagLayout布局,可以灵活的放置组件和自定义其随窗口变化的适应性. 首先,如何使用GridBagLayout布局 GridBagLayout lay=new GridBagLayout(); GridBagConstraints c=new GridBagConstraints(); frame.setLayout(lay);//为frame设置布局管理器 //设置c的各项参数 lay.setConstraints(panel1, c);//放置

Java图形化界面设计——布局管理器之GridBagLayout

GridBagLayout 不会随着窗口的变化标签随之发生变化,可固定. ---------------------------------------------------------- import java.awt.Button;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.event.WindowAdapter;import ja

Java GridBagLayout 简单使用

这里只介绍了很基础布局构建及使用,主要是关于 GridBagLayout. 首先整套流程大概是, 声明一个 GridBagLayout 对象 private GridBagLayout gridBagLayoutFrame = new GridBagLayout(); 然后把当前类的容器布局管理器设置为 GridBagLayout this.setLayout(gridBagLayoutFrame); 最后声明一个 JPanel 用于添加组件.(当然也可以是别的Panel.如JTabbedPan