- 浏览: 130252 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xiaojiit:
99九夜茴 写道请问能不能把服务器端是Java的Web传我一下 ...
C# 编程WinForm 上传文件到 Asp.Net 的 Web项目 -
99九夜茴:
请问能不能把服务器端是Java的Web传我一下啊?我把代码复制 ...
C# 编程WinForm 上传文件到 Asp.Net 的 Web项目 -
xiaojiit:
不好意思,忘记传了。
Web通用简体繁体转化Js -
wwwcomy:
Language.js他人呢
Web通用简体繁体转化Js -
xiaojiit:
luogen33 写道 这美眉 很强悍啊!!哈哈,过奖过 ...
Java 获取系统信息,包括CPU使用率、硬盘大小、网卡状态、系统信息等
GridLayout布局
GridLayout 布局的功能非常强大,也是笔者常用的一种布局方式。GridLayout是网格式布局,它把父组件分成一个表格,默认情况下每个子组件占据一个单元格的空间,每个子组件按添加到父组件的顺序排列在表格中。
GridLayout提供了很多的属性,可以灵活设置网格的信息。另外,GridLayout 布局提供了GridData类,子组件可以设置相应的GridData,例如“dogPhoto.setLayoutData(gridData)”, GridData可以设置每个组件当做单元格的信息。
GridLayout的风格
GridLayout类提供了GridLayout 布局中划分网格的信息,主要通过以下几个参数进行设置。
NumColumns:通过“gridLayout.numColumns”属性可以设置父组件中分几列显示子组件,如表3所示。
MakeColumnsEqualWidth:通过“gridLayout. makeColumnsEqualWidth”属性可以设置父组件中子组件是否有相同的列宽,当MakeColumnsEqualWidth为true时表示每列的列宽相等。
●MarginLeft:表示当前组件距离父组件左边距的像素点个数。
●MarginRight:表示当前组件距离父组件右边距的像素点个数。
●MarginTop:表示当前组件距离父组件上边距的像素点个数。
●MarginBottom:表示当前组件距离父组件下边距的像素点个数。
●HorizontalSpacing:表示子组件的水平间距。
●VerticalSpacing:表示子组件的垂直间距。
GridData的相关属性
GridLayout布局的灵活之处在于它利用网格布局数据GridData。通过GridData可以设置子组件在网格中的填充方式、大小边距等信息,用户可以通过子组件的setLayoutData方法设置网格布局数据。
GridData可以控制子组件在网格中的位置大小等相关显示信息。GridData可以设置如下的一些属性。
●HorizontalAlignment:表示水平对齐方式。水平对齐方式有如下几种,如表4所示,其中“Button5”按钮显示了水平对齐的方式。
●VerticalAlignment:表示子组件的垂直对齐方式,值和水平方式一样。
●HorizontalIndent:表示子组件水平偏移多少像素。
此属性和“horizontalAlignment = GridData.BEGINNING”属性一起使用。下面代码设置“Button5”水平偏移4像素,如图3所示。
GridData gridData = new GridData(); gridData.horizontalIndent = 4; button5.setLayoutData(gridData); |
HorizontalSpan:表示组件水平占据几个网格。
此属性非常有用,当要设置一个组件占据几个单元格时,需要设置HorizontalSpan属性。例如,下面代码设置“Button5”按钮水平占据两个网格,如图4所示。
GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.horizontalSpan = 2; button5.setLayoutData(gridData); |
图3 组件水平偏移 图4 水平占据网格
●VerticalSpan:表示组件垂直占据几个网格。
●GrabExcessHorizontalSpace:表示当父组件大小改变时,子组件是否以水平方向抢占空间。
●GrabExcessVerticalSpace:表示当父组件大小改变时,子组件是否以垂直方向抢占空间。
●WidthHint:表示子组件的宽度为多少像素(前提是未设置其他相关属性)。
●HeightHint:表示子组件的高度为多少像素(前提是未设置其他相关属性)。
另外,GridData可以通过构造函数指定相应的属性值,有兴趣的读者可以参考GridData类的构造函数。
GridLayout 布局实例
为了更深入地理解GridLayout 布局,下面通过具体的实例演示如何构建一个比较复杂的布局窗口。通过本例的学习,读者可以比较好地掌握GridLayout布局,代码如例程3所示。
例程3 ComplexGridLayoutExample.java
public class ComplexGridLayoutExample { static Display display; static Shell shell; static Text dogName; static Combo dogBreed; static Canvas dogPhoto; static Image dogImage; static List categories; static Text ownerName; static Text ownerPhone; public static void main(String[] args) { display = new Display(); shell = new Shell(display); shell.setText("Dog Show Entry"); //新建GridLayout布局 GridLayout gridLayout = new GridLayout(); //把子组件分成3列显示 gridLayout.numColumns = 3; shell.setLayout(gridLayout); new Label(shell, SWT.NONE).setText("Dog's Name:"); dogName = new Text(shell, SWT.SINGLE | SWT.BORDER); //新建水平填充的GridData GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); //GridData的组件占两列显示 gridData.horizontalSpan = 2; dogName.setLayoutData(gridData); new Label(shell, SWT.NONE).setText("Breed:"); dogBreed = new Combo(shell, SWT.NONE); dogBreed.setItems(new String [] {"Collie", "Pitbull", "Poodle", "Scottie"}); dogBreed.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); Label label = new Label(shell, SWT.NONE); label.setText("Categories"); label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); new Label(shell, SWT.NONE).setText("Photo:"); dogPhoto = new Canvas(shell, SWT.BORDER); //gridData两端填充 gridData = new GridData(GridData.FILL_BOTH); //gridData最佳宽度和高度 gridData.widthHint = 80; gridData.heightHint = 80; //设置gridData的子组件垂直占3行 gridData.verticalSpan = 3; dogPhoto.setLayoutData(gridData); //添加画布的重画事件 dogPhoto.addPaintListener(new PaintListener() { public void paintControl(final PaintEvent event) { if (dogImage != null) { event.gc.drawImage(dogImage, 0, 0); } } }); categories = new List(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL); categories.setItems(new String [] { "Best of Breed", "Prettiest Female", "Handsomest Male", "Best Dressed", "Fluffiest Ears", "Most Colors", "Best Performer", "Loudest Bark", "Best Behaved", "Prettiest Eyes", "Most Hair", "Longest Tail", "Cutest Trick"}); gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData. VERTICAL_ALIGN_FILL); gridData.verticalSpan = 4; int listHeight = categories.getItemHeight() * 12; Rectangle trim = categories.computeTrim(0, 0, 0, listHeight); gridData.heightHint = trim.height; categories.setLayoutData(gridData); Button browse = new Button(shell, SWT.PUSH); browse.setText("Browse..."); gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); gridData.horizontalIndent = 5; browse.setLayoutData(gridData); //添加按钮的选择事件 browse.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { String fileName = new FileDialog(shell).open(); if (fileName != null) { dogImage = new Image(display, fileName); dogPhoto.redraw(); } } }); Button delete = new Button(shell, SWT.PUSH); delete.setText("Delete"); gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData. VERTICAL_ALIGN_BEGINNING); gridData.horizontalIndent = 5; delete.setLayoutData(gridData); delete.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { if (dogImage != null) { dogImage.dispose(); dogImage = null; dogPhoto.redraw(); } } }); Group ownerInfo = new Group(shell, SWT.NONE); ownerInfo.setText("Owner Info"); gridLayout = new GridLayout(); gridLayout.numColumns = 2; ownerInfo.setLayout(gridLayout); gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); gridData.horizontalSpan = 2; ownerInfo.setLayoutData(gridData); new Label(ownerInfo, SWT.NONE).setText("Name:"); ownerName = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER); ownerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); new Label(ownerInfo, SWT.NONE).setText("Phone:"); ownerPhone = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER); ownerPhone.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Button enter = new Button(shell, SWT.PUSH); enter.setText("Enter"); gridData = new GridData(GridData.HORIZONTAL_ALIGN_END); gridData.horizontalSpan = 3; enter.setLayoutData(gridData); enter.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { System.out.println("\nDog Name: " + dogName.getText()); System.out.println("Dog Breed: " + dogBreed.getText()); System.out.println("Owner Name: " + ownerName.getText()); System.out.println("Owner Phone: " + ownerPhone.getText()); System.out.println("Categories:"); String cats[] = categories.getSelection(); for (int i = 0; i < cats.length; i++) { System.out.println("\t" + cats[i]); } } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } if (dogImage != null) { dogImage.dispose(); } } } |
程序中构建了一个比较复杂的窗口,设置了GridLayout的布局信息和相关的GridData网格数据信息,程序运行效果如图5所示。
图5 GridLayout布局实例
注意:每个GridData都必须有单独的实例,几个子组件不能够共用同一个GridData(即使几个组件有相同属性的GridData也必须新建几个实例)。
自定义布局
在SWT中,用户可以通过setLayout设置组件的布局信息。布局对象会根据父组件的大小和子组件的布局信息计算出每个子组件的位置和大小,使整个布局空间符合用户的需求。下面将介绍如何创建自己的布局类,实现用户自定义的布局。
Layout类
在SWT中,所有的布局类都继承于Layout抽象类。Layout有两个抽象方法。
1. computeSize (Composite composite, int wHint, int hHint, boolean flushCache) 2. layout (Composite composite, boolean flushCache) |
computeSize方法负责计算组件所有子组件所占的高度和宽度,并返回一个Point类型的变量(width,height)。layout方法负责计算子组件的大小和位置,并按计算出来的位置排列子组件。
创建自己的布局类
如果用户希望组件按自己的方式进行布局,可以创建自己的布局类,实现自己的布局。要实现自己的布局,用户要继承Layout类,并实现layout 方法和computeSize方法。下面将实现一个简单的按列进行布局的布局类,在此布局中,所有的子组件将按一列显示,并且子组件的宽度相等,代码如例 程4所示。
例程4 ColumnLayout.java
public class ColumnLayout extends Layout { public static final int MARGIN = 4; public static final int SPACING = 2; Point [] sizes; int maxWidth, totalHeight; protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { Control children[] = composite.getChildren(); if (flushCache || sizes == null || sizes.length != children.length) { initialize(children); } int width = wHint, height = hHint; if (wHint == SWT.DEFAULT) width = maxWidth; if (hHint == SWT.DEFAULT) height = totalHeight; return new Point(width + 2 * MARGIN, height + 2 * MARGIN); } protected void layout(Composite composite, boolean flushCache) { Control children[] = composite.getChildren(); if (flushCache || sizes == null || sizes.length != children.length) { initialize(children); } Rectangle rect = composite.getClientArea(); int x = MARGIN, y = MARGIN; //计算最大宽度 int width = Math.max(rect.width - 2 * MARGIN, maxWidth); for (int i = 0; i < children.length; i++) { int height = sizes[i].y; //设置子组件的位置 children[i].setBounds(x, y, width, height); //计算当前组件的y轴的坐标 y += height + SPACING; } } void initialize(Control children[]) { maxWidth = 0; totalHeight = 0; sizes = new Point [children.length]; for (int i = 0; i < children.length; i++) { //计算子组件的大小 sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, true); maxWidth = Math.max(maxWidth, sizes[i].x); totalHeight += sizes[i].y; } totalHeight += (children.length - 1) * SPACING; } } |
在ColumnLayout类中,通过layout方法对子组件重新计算位置,并设置子组件的位置。为了验证ColumnLayout类,下面通过ColumnLayoutTest类测试ColumnLayout类的效果,代码如例程5所示。
例程5 ColumnLayoutTest.java
public class ColumnLayoutTest { static Shell shell; static Button button3; public static void main(String[] args) { Display display = new Display(); shell = new Shell(display); shell.setLayout(new ColumnLayout()); new Button(shell, SWT.PUSH).setText("B1"); new Button(shell, SWT.PUSH).setText("Very Wide Button 2"); (button3 = new Button(shell, SWT.PUSH)).setText("Button 3"); new Text(shell, SWT.NONE).setText("text"); Button grow = new Button(shell, SWT.PUSH); grow.setText("Grow Button 3"); // 添加选择组件监听器 grow.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { button3.setText("Extreemely Wide Button 3"); //组件大小改变后通知父组件进行重新布局 shell.layout(); shell.pack(); } }); Button shrink = new Button(shell, SWT.PUSH); shrink.setText("Shrink Button 3"); shrink.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { button3.setText("Button 3"); //组件大小改变后通知父组件进行重新布局 shell.layout(); shell.pack(); } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } } |
当选择“Grow Button 3”组件后,layout方法会根据子组件的最大宽度调整所有子组件的宽度,程序运行效果如图6所示。
原始大小 宽度改变后
图6 自己定义布局
本节通过实例介绍了几种常用的布局方式,读者可以通过这几种布局方式实现SWT中大多数的布局需求。另外还有一种常用的布局FormLayout,有兴趣读者可以自行研究,在这里不一一介绍。
如果有某些比较特殊的要求,读者可以尝试修改布局类,以适应相关的布局。读者应该掌握如何设置组件相应的布局信息,掌握如何使用几种方式进行布局,特别是GridLayout布局方式。在有特殊需要的时候要能够修改布局类以适应自己的要求。
发表评论
-
【小程序】java生成integer的字符串序列
2016-08-06 11:33 4321、效果如下: 输入1——5,返回1,2,3, ... -
Java单线程池
2015-07-22 10:04 571package com.hebei.read.core.pl ... -
自定义Java多线程池
2015-07-22 10:04 525package com.anda.threads; i ... -
自定义Java线程池
2015-07-22 10:02 0package com.anda.threads; i ... -
Linux下将Tomcat设置为Chkconfig启动方式
2013-12-14 16:19 701#!/bin/sh # # tomcat: Start ... -
java文件下载文件名乱码(转)
2013-11-19 11:25 692response.setHeader(...)下载 ... -
Tomcat、Apache、Mod_JK整合
2012-01-16 19:17 1525Apache、Tomcat、mod_jk 域名解析 1、安装 ... -
Java HashMap的两种排序方式
2011-12-09 18:31 922Map<String, Integer> ... -
使网页变灰,支持IE、FireFox、Opera、360浏览器等
2011-12-06 10:44 28511、对IE的支持,只需要在CSS中添加如下代码: ... -
Java 获取指定时间
2011-12-05 17:29 2087// 用来全局控制 上一周,本周,下一周的周数变化 ... -
Java 获取系统信息,包括CPU使用率、硬盘大小、网卡状态、系统信息等
2011-10-28 15:05 8754采用singar.jar实现,需要将sigar-x86-win ... -
CentOS Linux 下Tomcat启动脚本
2011-09-24 10:09 1559#!/bin/bash # # Init file ... -
IE6下DIV高度的问题
2011-06-30 09:14 823在IE6下,使用 height:10px;时,比实际的高度要高 ... -
非常不错的JS插件
2010-04-22 10:26 639从网上发现一个JS日期插件,经过自己修改,非常好用了,在此标识 ... -
基于xfire的web service搭建
2009-03-27 12:39 1604这里,用的xfire1.2.6和Spring 2.0,开发工具 ... -
Linux系统下JSP服务器配置步骤详解
2008-03-07 10:27 965接触JSP服务器 的人基本上都是从JSP的安装开始的 ... -
Java专业术语标准化规范
2008-03-08 09:32 830-A- AJAX: (建议不译,原因:专有名词) ... -
Eclipse开发经典教程:SWT布局(1)
2008-03-08 09:52 2383在Java 中,GUI程序开发的目标之一是跨平台,而每种类型 ... -
JSP 文件上传
2008-08-18 17:22 1084这些天做JSP 的网站,遇到一个上传文件的问题,经过查找,终 ... -
利用 commons-fileupload 组件进行文件上传
2008-09-19 14:48 871<wbr> </wbr><wb ...
相关推荐
Eclipse开发经典教程,SWT中采用了布局方式,用户可使用布局来控制组件中元素的位置和大小等信息。
Eclipse开发经典教程:常用SWT组件.pdf
Eclipse开发经典教程:常用快捷键 ,本节将从笔者的亲身经验总结出一些快捷键,并对快捷键进行分类,而且按笔者的喜好进行排列,并加上相关的解释,希望读者能用心去体会。
SWT编程开发学习资料和一些实例代码,Eclipse开发经典教程:SWT开发
包含9个部分,另附<Eclipse核心编程——插件、界面与Web开发 (节选)> 9个部分分别是:SWT布局,常用SWT组件,SWT事件,TreeViewer组件,展现组件,常用快捷键,插件安装,单元测试,代码重构
eclipse插件开发: rcp/swt相关资料 rcp swt 插件开发
重要讲解eclipse的开发插件SWT的开发布局,swt是在java平台下一种界面开发插件
java eclipse swt word教程
Eclipse开发经典教程-TreeViewer组件
Eclipse SWT Designer安装教程
Eclipse插件开发教程PPT Eclipse插件开发教程PPT
swt是一些用于javaGUI即图形界面设计用的插件,但是当执行打包好的exe文件时,容易出现找不到jar包的错误,这里提供下载资源
org.eclipse.swt.browser.PromptService2Factory.class org.eclipse.swt.browser.Prompter.class org.eclipse.swt.browser.SimpleEnumerator.class org.eclipse.swt.browser.StatusTextEvent.class org.eclipse.swt....
eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse swt eclipse ...
Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT Eclipse RCP开发教程,RCP入门教程,教你如何使用SWT
eclipse插件开发笔记第三章:SWT编程基础 eclipse插件开发笔记第三章:SWT编程基础 eclipse插件开发笔记第三章:SWT编程基础
教程名称: 【动力节点】Java经典教程_Eclipse开发必备快捷键视频教程本套Java视频教程主要介绍了Eclipse如何从官网下载,及详细地安装与配置过程;并讲解了在Eclipse下如何创建Java工程及JavaWeb工程;并通过Java...
Eclipse插件开发教程 Eclipse插件开发
Eclipse+SWTJFace开发实战精解,SWT例子,Eclipse开发入门与项目实践+源代码