GridBagLayout布局管理器应用详解
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.下面就是代码实现了,先看下效果图吧
这是运行生成的界面
这是拉伸之后的界面
关键代码如下
- private void addGridBagPanes() {
- //上侧的工具选择面板
- JPanel toolSelectPanel = new JPanel();
- toolSelectPanel.setBackground(Color.green);
- this.add(toolSelectPanel, new GBC(0,0,2,1).
- setFill(GBC.BOTH).setIpad(200, 50).setWeight(100, 0));
- //左侧的具体工具面板
- JPanel toolConcretePanel = new JPanel();
- toolConcretePanel.setBackground(Color.YELLOW);
- this.add(toolConcretePanel,new GBC(0,1).
- setFill(GBC.BOTH).setIpad(70, 90).setWeight(0, 100));
- //右侧的绘图面板
- JPanel drawPanel = new JPanel();
- drawPanel.setBackground(Color.WHITE);
- this.add(drawPanel,new GBC(1,1).setFill(GBC.BOTH));
- //下侧的颜色选择面板
- JPanel colorPanel = new JPanel();
- colorPanel.setBackground(Color.LIGHT_GRAY);
- this.add(colorPanel,new GBC(0,2,2,1).
- setFill(GBC.BOTH).setIpad(200,50).setWeight(100, 0));
- //下侧的状态面板
- JPanel statePanel = new JPanel();
- statePanel.setBackground(Color.CYAN);
- this.add(statePanel,new GBC(0,3,2,1).
- setFill(GBC.BOTH).setIpad(200, 20).setWeight(100, 0));
- }
其中的GBC类继承于GridBagConstraints这样做的目的是简化每次对GridBagConstraints对象的直接操作带来的繁琐,而GBC的各个set方法返回的都是一个GBC对象因此可以接连调用set方法。GBC类的代码如下:
- public class GBC extends GridBagConstraints
- {
- //初始化左上角位置
- public GBC(int gridx, int gridy)
- {
- this.gridx = gridx;
- this.gridy = gridy;
- }
- //初始化左上角位置和所占行数和列数
- public GBC(int gridx, int gridy, int gridwidth, int gridheight)
- {
- this.gridx = gridx;
- this.gridy = gridy;
- this.gridwidth = gridwidth;
- this.gridheight = gridheight;
- }
- //对齐方式
- public GBC setAnchor(int anchor)
- {
- this.anchor = anchor;
- return this;
- }
- //是否拉伸及拉伸方向
- public GBC setFill(int fill)
- {
- this.fill = fill;
- return this;
- }
- //x和y方向上的增量
- public GBC setWeight(double weightx, double weighty)
- {
- this.weightx = weightx;
- this.weighty = weighty;
- return this;
- }
- //外部填充
- public GBC setInsets(int distance)
- {
- this.insets = new Insets(distance, distance, distance, distance);
- return this;
- }
- //外填充
- public GBC setInsets(int top, int left, int bottom, int right)
- {
- this.insets = new Insets(top, left, bottom, right);
- return this;
- }
- //内填充
- public GBC setIpad(int ipadx, int ipady)
- {
- this.ipadx = ipadx;
- this.ipady = ipady;
- return this;
- }
- }
GridBagLayout布局管理器应用详解的更多相关文章
- JAVA中GridBagLayout布局管理器应用详解
很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...
- Python Tkinter模块 Grid(grid)布局管理器参数详解
在使用Tkinter模块编写图像界面时,经常用到pack()和grid()进行布局管理,pack()参数较少,使用方便,是最简单的布局,但是当控件数量较多时,可能需要使用grid()进行布局(不要在同 ...
- 系统批量运维管理器Fabric详解
系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...
- PHPFastCGI进程管理器PHP-FPM详解
PHP-FPM是一个PHPFastCGI进程管理器,是只用于PHP的. PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PH ...
- 系统批量运维管理器pexpect详解
一.pexpect介绍 pexpect可以理解成Linux下的expect的Python封装,通过pexpect我们可以实现对ssh.ftp.passwd.telnet等命令进行自动交互,而无需人工干 ...
- 系统批量运维管理器paramiko详解
一.paramiko介绍 paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式.可以实现远程命令执行.文件传输.中间SSH代理等功能,相对于Pexpect,封装的层次更高, ...
- learning java AWT 布局管理器 GridBagLayout
在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相关. import java.awt.*; public class GridBagTest { ...
- JAVA布局管理器
JAVA的界面布局原理:由于Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台.不同分辨率下的显示效果不一样.Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的全部组 ...
- 【java】浅析java组件中的布局管理器
这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...
随机推荐
- LVS持久化与超时时间问题分析
前言 在上一篇文章<搭建DNS+LVS(keepAlived)+OpenResty服务器(Docker环境)>中,我搭建了dns+lvs+openresty+web集群:先来回顾一下架构图 ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- oracle创建表的方法和一些常用命令
1.主键和外键主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(注意是组,可以是一个,也可以是多个)能唯一标识一条记录,那么该属性组就是主键外键:关系型数据库表中的一列或者某几列的组 ...
- EF 求和 GroupBy多个字段
GroupBy根据多个字段分组使用方式: 一.使用扩展方法 query.GroupBy(q => new { q.Year, q.Month }) .Select(q => new { Y ...
- Java基础——iO(三)
一.管道流 演示:PipedInputStream , PipedOutputStream 注意:管道流本身就不建议在一个线程中使用,这是因为向输出流中写的数据,都会存到输入流内部的一个1024字节 ...
- mongodb远程连接访问
随着云计算,云服务的不断发展演进,数据库的管理及维护方式也在转变,传统基于C/S客户端工具管理的方式,已经无法满足实际需要. TreeSoft数据库管理系统,采用web方式,对mongoDB,MySQ ...
- Spring全家桶系列–[SpringBoot入门到跑路]
//本文作者:cuifuan Spring全家桶————[SpringBoot入门到跑路] 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么 ...
- C++11 使用 std::async创建异步程序
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...
- HDU6198
number number number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- JS 提升 p4
提示不多说,记住几个要点: 1.变量和函数都会提升,如下 a = 2; var a ; console.log(a); fn(); function fn(){ console.log(1); } 2 ...