http://www.cnblogs.com/kungfupanda/p/7220217.html

GridBagLayout布局管理器应用详解

很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成。但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够自由改变一个程序界面的大小,通过托拽生成的界面往往是不提供这个功能的,因为定制的界面一旦改变形状,组件间的布局会变得杂乱无章。

Java中的布局管理器应用了策略者模式(Strategy),为不同类型的组件布局提供了很好的模型。而其中的网格组布局管理器(GridBagLayout)被认为是所有布局管理器中最强大的。下面笔者将通过一个例子讲述它的使用方法。

1.笔者目标是实现一个WindowsXP下画图板的框架,下面是设计模型图

我们可以将GridBagLayout看作没有任何约束或限制的网格布局(GridLayout),一个组件可以占据若干行和列,而且大小设定也是自由的。从上图我们可以清晰的看到整个画图板界面被划分为4行2列的一个表格,我们先不用管某个单元格的大小,只管划分。

这样五个具体的面板(我们使用JPanel对象进行填充)就构成了整个界面,上侧占据1行2列的工具选择面板(toolSelectPanel),左侧1行1列的某个工具的选项面板(toolConcretePanel),右侧的drawPanel,下侧的colorPanel和statePanel

2.我们通过以下步骤为界面进行GridBagLayout布局

1).设置主界面的布局管理器为GridBagLayout(不用指定行和列)

2).为界面中的每一个组件(这里是JPanel对象)指定一个GridBagConstraints对象,通过设置该对象的属性值指出组件在

管理器中的布局方案

3).通过下面的调用添加组件极其约束条件(GridBagConstraints对象)

add(Component,constraints);

我们有必要了解一下GridBagConstraints中各个属性的具体含义以便我们更好的进行个性化的布局

@gridx,gridy:

组件左上角所在的位置,如上图中左侧的面板在1行0列,则gridy=0,gridx=1。读者请注意这里的行对应的是gridy,列对应的是gridx

@gridwidth,gridheight

组件占据的行数和列数,如最上面的那个面板占了1行2列,则gridwidth=2,gridheight=1

@weightx,weighty

可以简单理解为组件大小变化的增量值,如设置weightx=100,组件会随着单元格而变化,设置weightx=0时,组件大小不会发生变化。当然weightx,weighty也可以设置成其他的值,不过意义不大,就不再详细介绍。

@fill

组件在所处格子(分配区域)内的填充方式

如fill= HORIZONTAL,组件就只在水平方向上填充满单元格,取fill= BOTH则会填满整个格子。

@anchor

组件在所处格子内的对其方式,取anchor=EAST就是指右对齐

@ipadx,ipady

内部填充,是指在组件首选大小的基础上x方向上加上ipadx,y方向上加上ipady,这样做就可以保证组件不会收缩到ipadx,ipady所确定的大小以下,因此我们可以用ipadx,ipady的值来指定组件的大小,而不必指定组件的大小否则会有意想不到的效果

@insets

外部填充,填充的区域是组件与所处格子边框之间的部分,有left,top,right,bottom四个参数,不过当组件的fill=NONE时,指定insects值是无意义的

3.下面就是代码实现了,先看下效果图吧

这是运行生成的界面

这是拉伸之后的界面

关键代码如下

  1. private void addGridBagPanes() {
  2. //上侧的工具选择面板
  3. JPanel toolSelectPanel = new JPanel();
  4. toolSelectPanel.setBackground(Color.green);
  5. this.add(toolSelectPanel, new GBC(0,0,2,1).
  6. setFill(GBC.BOTH).setIpad(200, 50).setWeight(100, 0));
  7. //左侧的具体工具面板
  8. JPanel toolConcretePanel = new JPanel();
  9. toolConcretePanel.setBackground(Color.YELLOW);
  10. this.add(toolConcretePanel,new GBC(0,1).
  11. setFill(GBC.BOTH).setIpad(70, 90).setWeight(0, 100));
  12. //右侧的绘图面板
  13. JPanel drawPanel = new JPanel();
  14. drawPanel.setBackground(Color.WHITE);
  15. this.add(drawPanel,new GBC(1,1).setFill(GBC.BOTH));
  16. //下侧的颜色选择面板
  17. JPanel colorPanel = new JPanel();
  18. colorPanel.setBackground(Color.LIGHT_GRAY);
  19. this.add(colorPanel,new GBC(0,2,2,1).
  20. setFill(GBC.BOTH).setIpad(200,50).setWeight(100, 0));
  21. //下侧的状态面板
  22. JPanel statePanel = new JPanel();
  23. statePanel.setBackground(Color.CYAN);
  24. this.add(statePanel,new GBC(0,3,2,1).
  25. setFill(GBC.BOTH).setIpad(200, 20).setWeight(100, 0));
  26. }

其中的GBC类继承于GridBagConstraints这样做的目的是简化每次对GridBagConstraints对象的直接操作带来的繁琐,而GBC的各个set方法返回的都是一个GBC对象因此可以接连调用set方法。GBC类的代码如下:

  1. public class GBC extends GridBagConstraints
  2. {
  3. //初始化左上角位置
  4. public GBC(int gridx, int gridy)
  5. {
  6. this.gridx = gridx;
  7. this.gridy = gridy;
  8. }
  9. //初始化左上角位置和所占行数和列数
  10. public GBC(int gridx, int gridy, int gridwidth, int gridheight)
  11. {
  12. this.gridx = gridx;
  13. this.gridy = gridy;
  14. this.gridwidth = gridwidth;
  15. this.gridheight = gridheight;
  16. }
  17. //对齐方式
  18. public GBC setAnchor(int anchor)
  19. {
  20. this.anchor = anchor;
  21. return this;
  22. }
  23. //是否拉伸及拉伸方向
  24. public GBC setFill(int fill)
  25. {
  26. this.fill = fill;
  27. return this;
  28. }
  29. //x和y方向上的增量
  30. public GBC setWeight(double weightx, double weighty)
  31. {
  32. this.weightx = weightx;
  33. this.weighty = weighty;
  34. return this;
  35. }
  36. //外部填充
  37. public GBC setInsets(int distance)
  38. {
  39. this.insets = new Insets(distance, distance, distance, distance);
  40. return this;
  41. }
  42. //外填充
  43. public GBC setInsets(int top, int left, int bottom, int right)
  44. {
  45. this.insets = new Insets(top, left, bottom, right);
  46. return this;
  47. }
  48. //内填充
  49. public GBC setIpad(int ipadx, int ipady)
  50. {
  51. this.ipadx = ipadx;
  52. this.ipady = ipady;
  53. return this;
  54. }
  55. }

GridBagLayout布局管理器应用详解的更多相关文章

  1. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  2. Python Tkinter模块 Grid(grid)布局管理器参数详解

    在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...

  3. 系统批量运维管理器Fabric详解

    系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...

  4. PHPFastCGI进程管理器PHP-FPM详解

    PHP-FPM是一个PHPFastCGI进程管理器,是只用于PHP的.      PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PH ...

  5. 系统批量运维管理器pexpect详解

    一.pexpect介绍 pexpect可以理解成Linux下的expect的Python封装,通过pexpect我们可以实现对ssh.ftp.passwd.telnet等命令进行自动交互,而无需人工干 ...

  6. 系统批量运维管理器paramiko详解

    一.paramiko介绍 paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能,相对于Pexpect,封装的层次更高, ...

  7. learning java AWT 布局管理器 GridBagLayout

    在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相关. import java.awt.*; public class GridBagTest { ...

  8. JAVA布局管理器

    JAVA的界面布局原理:由于Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台.不同分辨率下的显示效果不一样.Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的全部组 ...

  9. 【java】浅析java组件中的布局管理器

    这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...

随机推荐

  1. Tomcat学习总结(6)——Tomca常用配置详解

    注:Tomcat 8需要JRE7以上的JRE 1. Tomcat环境变量设置 1.1 Java环境变量设置 右键计算机—属性—高级系统设置—环境变量,在”系统环境变量”,设置如下三个变量(如果变量已有 ...

  2. Python高级特性:迭代器和生成器 -转

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  3. UEFI+GPT与BIOS+MBR各自有什么优缺点?

    1.分区数量上,gpt好像可以支持无限个分区,不过window上只认128个,而且gpt分区不分主分区,逻辑分区,可以理解为全部都是主分区,就相当于可以允许你一个分区一个系统,128个系统了.而这是m ...

  4. Css相册

    对于相册,大家都很熟悉,常见的一种如下图所示: 当你点击下面的数字的时候,就会换一张图片,直接用链接就可以实现,很简单.下面我们将介绍其他两种css相册. 第一种css相册: 我们先来看看示意图: 当 ...

  5. C# 在webapi项目中配置Swagger(最新版2017)

    这篇文章已经过时了: http://www.cnblogs.com/alunchen/p/6888002.html 不用那么繁琐的配置了,直接导入一个包就行了: Install-Package Swa ...

  6. [转]腾讯云Linux云服务器文件上传利器——WinSCP

    本文转自:http://bbs.qcloud.com/thread-4379-1-1.html WinSCP简介 WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持S ...

  7. 一个很好用的SqlHelper类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 【16】命令模式(Command Pattern)

    一.前言 最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师 ...

  9. IIS进程回收后第一次访问慢的问题

    IIS 有一种机制,默认会在IIS空闲一定时间段后,将应用程序池进行回收,这个时间段在IIS6中默认是20分钟,在IIS7中默认是1740分钟.两个配置都不合理,都会导致当应用程序池被回收后,第一次访 ...

  10. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...