`

SWT布局深入学习

阅读更多
以下内容是学习"The Definitive Guide to SWT and JFace"(SWT/JFace权威指南)做的笔记

对于Window编程来说, 我们一般不会涉及到布局这个概念,因为基本上我们都是直接设置控件的大小, 位置等布局信息, 但是对于java来说就不一样了, 它涉及到跨平台的问题, 控件的位置和大小不是由它本身来控制的,因此我们不会看到控件有x, y, width, height等属性,而必须通过外面LayoutData和Layout来控制控件的位置和大小,这个是使用Java进行客户端编程必须转变的一个观念,当然这个也不是绝对,后面我们也会看到不使用布局的做法,但是我们一般不提倡这样做

Layout可以理解为它是控件和其所在容器之间的一层抽象, 它决定了控件在容器中的位置, 而且它是与平台无关的, 它会根据容器大小的变动来调整控件的尺寸.而且容器只能设置一种布局方式, 其包含的控件的布局是不依赖其他容器的

首先要介绍的是FillLayout, 它是所有布局中最简单的一种, 使用了该布局的容器中的所有控件将以同一尺寸放在一行或者一列中, 它有一个type属性,用来指定布局是采用列排列还行排列, type的属性值为SWT.HORIZONTAL和SWT_VERTICAL, 默认情况下是行排列, 因为这个type是一个int常量,如果这个常量既不是水平也不是垂直的话,他们系统将默认是垂直排列

接下来是RowLayout,跟FillLayout比较类似,都是按行或列排列包含在容器中的控件, 唯一不同的就是不会限制所有的控件采用同一大小, 而且如果一行或一列排列不下时会自动换行或者换列, 在使用RowLayout的时候,还会用到RowData类, 容器中的控件将通过它来制定自己的大小, RowLayout将根据每个控件的RowData信息来决定控件在整个容器中放置的位置, RowData可以直接在构造函数中通过width和height参数设置,也可以将width和height包装成Point对象作为其构造参数来设置其大小, RowLayout除了有一个跟FillLayout一样的type属性之外,还有另外几个属性需要介绍一下:
justify属性为true表示位于同一列或者同一行中的控件之间的间距相等;
marginBottom(Left, Right, Top)设置边距;
space指定间距;
wrap指定是否换行;

所有的布局都可以通过GridLayout来实现, 它也是我们用的最多的布局, 它采用表格的形式来放置容器所包含的控件, numColumns是该布局最重要的属性, 他决定了布局的结构, 所有的控件将从左到右被放在容器中, 它还有一些其他的属性:
horizontal(vertical)Spacing指定相邻单元格间距;
makeColumnsEqualWidth 是否强制同宽;
marginHeight(Width, Top, Bottom)设置指定边距;
我们还可以结合给控件指定GridData来进行布局, 但是GridData不能在控件之间公用, 它的一些属性必须说明:
grabExcessHorizontal(Vertical)Space为true的意思是指定控件所在单元格将获取所在行(列)剩余的所有空间, 如果一行(列)有多个控件设定该属性为true则只有第一个设置有效, 注意这里只的是cell并不是控件;
height(width)Hint设置控件的最小高(宽),注意这里指的是控件而不是单元格;
horizontal(vertical)Alignment:这个属性用来设置控件在单元格中的对其方式,有BEGINNING(左对齐),CENTER(居中),END(右对齐),FILL(填满整个单元格)几个值;
horizontal(vertical)Indent:这个是用来水平(垂直)方向上设置控件到单元格之间的间隔;
horizontal(vertical)Span:是用来指定控件在水平(垂直)方向上所占用的单元格;
GridData还有一些常量需要解释一下,BEGINNING,CENTER,END,FILL是用来设置对其方式的,不能作为构造函数的style参数, FILL_BOTH相当于将horizontalAlignment, verticalAlignment设置为FILL加上grabExcessHorizontalSpace和grabExcessVerticalSpace设置为true, 也就是说在构造函数的style参数设置为该值相当于设置了4个属性;FILL_HORIZONTAL =  (horizontalAlignment = FILL) + (grabExcessHorizontalSpace=true); FILL_VERTICAL = (verticalAlignment = FILL) + (grabExcessVerticalSpace=true); GRAB_HORIZONTAL = (grabExcessHorizontalSpace =true); GRAB_VERTICAL = (grabExcessVerticalSpace =true), 类似HORIZONTAL_ALIGN_BEGINNING这样的从字面都可以知道意思了

FormLayout是所有布局里面最复杂的一种, 它也使用到自己的LayoutData:FormData, 另外它还会在FormData中通过使用FromAttachment来控制关联控件的位置, FormData可以设置四个FormAttachment实例,分别表示控件的四边与相对控件之间的位置关系, FormAttachment有以下几个成员变量:
alignment 用来指定关联的控件的某个边和相对控件之间的对齐方式, 如果关联的是上下位置,那么可以设置SWT.TOP, SWT.CENTER, SWT.BOTTOM,是左右位置可以设置SWT.LEFT, SWT.CENTER, and SWT.RIGHT, 该属性一般在指定的相对控件不是容器的时候使用, 否则会没有效果;
control属性指的是相对哪个控件,默认情况下是指的关联控件所在的容器;
denominator 是分母默认是100,这个一般不设置;
numerator是分子, 这两个值在control是关联对象的容器的时候才有意义, 用来指定应用的控件到容器关联边在整个容器中的百分比,说白了就是相对位置;
offset是偏移量,说白了就是关联控件与相对控件指定边之间的绝对位置
从FormAttachment的构造函数我们就可以看出来,一般哪些属性是一起设置的, 比如只设置control, 同时设置control和offset, 同时设置control, offset和alignment, 只设置分母, 同时设置分母和分子, 同时设置分母分子和偏移量

StackLayout是一个用的很少的布局, 从字面意思我们可以看出来, 它是将使用该布局的容器内的所有控件位置,大小设置为相同, 然后层叠在一起,只有位于最上面控件可见, 它使用topControl来指定哪个控件位于堆栈最上层并可见, 如果设置为null表示所有控件均不可见, 设置之后并调用容器的layout()方法才能使指定的控件可见

如何自定义布局
通过学习如何自定义布局,可以对SWT的布局实现做深层次的理解
自定义布局需要继承Layout类,并实现compluteSize和layout方法, 关联控件会调用compluteSize方法根据当前控件所包含子控件的大小计算出一个最小的尺寸值,返回值是Point里面的就是高宽值,就是确定要布局的容器的作用范围,而调用layout方法则是为容器中的每一个控件通过调用其setBounds方法来设置位置和大小, 如果需要更多的信息来帮助对控件进行布局,那么可以自己顶一个类来封装这些信息然后通过setLayoutData设置给control.

不使用布局
如果你不要面对垮平台,以及根据布局自动调整容器中的控件,那么也可以不通过布局来确定控件的位置和大小,通过自定义我们知道,布局都是通过调用里面控件的setBounds方法来确定控件的位置的,所以我们要做的就是直接调用控件的setBunds方法而已.
分享到:
评论
4 楼 macrochen 2008-06-12  
引用
请问一下老师,如果RCP程序要在unix下运行,请问该如何做?是不是要在unix环境下安装Eclipse?windows下发布的产品配置后能不能在unix下运行?

我都是windows下开发的, 这个不清楚
3 楼 nnnn 2008-06-11  
请问一下老师,如果RCP程序要在unix下运行,请问该如何做?是不是要在unix环境下安装Eclipse?windows下发布的产品配置后能不能在unix下运行?
2 楼 sunway 2008-04-16  
不错,分析的很正确。。
1 楼 xushiliang 2007-12-24  
在理

相关推荐

    swt - designer 学习实例

    在学习SWT时,首先需要了解它的基本概念,例如 SWT组件、布局管理以及事件处理机制。SWT组件是构建GUI的基本元素,包括Button、Label、Text、Shell等,它们对应于常见的GUI控件。每个组件都有其特定的方法和属性,...

    SWT编程开发学习资料

    在"SWT编程开发学习资料"中,你可以期待获取关于以下几个方面的深入理解和实践指导: 1. **SWT基础知识**:SWT提供了一系列控件,如按钮、文本框、列表、树、表格等,以及布局管理器,如FillLayout、GridLayout、 ...

    SWT 案例之学习精华

    通过"SWT案例之学习精华",你可以深入学习这些知识点,并结合"地址.txt"和"WSTDemo.rar"中的示例代码进行实践。"地址.txt"可能包含一些关于案例代码位置或使用说明的信息,而"WSTDemo.rar"很可能是包含实际SWT应用...

    swt 开发学习

    在深入学习SWT时,你可以参考各种教程、文档和示例代码。Eclipse官方网站提供了详尽的API文档和开发者指南。同时,社区论坛和Stack Overflow等平台上有大量的问答资源,可以帮助解决你在开发过程中遇到的问题。 ...

    swt高级密笈源码swt

    "SWT高级密笈源码"很可能是针对SWT库深入理解和实践的代码示例集合,旨在帮助开发者掌握SWT的高级用法。 本资源包含的"Sample Code"可能是各种基于SWT的实例代码,这些代码涵盖了SWT的各种组件、布局管理、事件处理...

    SWT开发教程1

    4. SWT布局管理: SWT提供了多种布局管理器,如FillLayout、GridLayout、FormLayout等,它们决定了组件在容器中的排列方式。通过合理地使用布局管理器,开发者可以创建出适应不同屏幕尺寸和分辨率的界面。 5. SWT...

    swt-api swt DOC

    【标题】"swt-api swt DOC" 指的是一个关于SWT(Standard Widget Toolkit)API的...通过深入研究这个文档,开发者不仅可以掌握SWT的基本用法,还能了解到高级特性和优化技巧,从而提升其在Java GUI编程领域的专业能力。

    Java swt完整教程

    4. SWT布局管理 SWT提供了几种布局管理器,如FillLayout、GridLayout、FormLayout等,用于控制组件在容器中的排列方式和大小调整。 5. SWT与JFace JFace是建立在SWT之上的抽象层,简化了SWT的使用,提供了一些...

    SWT插件中文教程SWT常用方法

    总的来说,SWT插件的常用方法涵盖了控件的创建、布局管理、事件处理等多个方面,学习并掌握这些方法对于编写高效、美观的Java GUI应用至关重要。通过阅读这个中文教程,开发者能够深入理解SWT的工作原理,并能够熟练...

    SWT widgets基本教程

    ### SWT Widgets 基本教程知识点详解 #### 1. 概述 SWT (Standard Widget Toolkit) 是 Eclipse 平台的一部分,它提供...掌握了这些基础知识后,您可以进一步深入学习 SWT 的高级特性,例如自定义控件、布局管理器等。

    SWT教程java开发文档

    **SWT教程——Java开发中的图形用户界面设计** SWT(Standard Widget Toolkit)是Java编程环境中用于构建桌面应用程序的一种GUI库。...通过深入学习,开发者可以熟练掌握如何用SWT构建高效、美观的Java桌面应用。

    SWT.rar_SWT tutorial_java swt_swt 登陆窗口_swt tutori_swt-designer

    本教程“SWT tutorial”针对SWT进行深入讲解,特别适合初学者学习。 SWT的核心概念是组件(Widgets),这些组件包括按钮、文本框、列表等,它们构成了GUI的基本元素。通过组合和配置这些组件,开发者可以创建各种...

    SWT界面设计PDF

    SWT(Standard Widget Toolkit)是Java...通过深入学习这些文档,你可以掌握SWT的核心原理和实践技巧,从而在Java GUI开发中游刃有余。记住,实践是检验真理的唯一标准,动手编写SWT程序将巩固你的理解并提升你的技能。

    swt学SWT者必备的帮助文档

    本帮助文档“swt学SWT者必备的帮助文档”是为那些想要深入学习和掌握SWT技术的开发者准备的。文档内容详细,覆盖了SWT的基本概念、组件使用、事件处理、布局管理等多个方面,是学习和开发SWT应用的重要参考资料。 ...

    swt 监控代码资料

    9. SWT布局管理:SWT提供了几种布局管理器,如FillLayout、GridLayout、FormLayout等,用于控制组件在容器中的排列方式。正确使用布局管理器可以确保界面在不同分辨率和屏幕尺寸下都能良好显示。 10. SWT国际化与...

    关于swing和swt的小练习

    8. ** SWT布局**:SWT的布局管理器包括GridLayout、RowLayout和FillLayout等,它们与Swing的布局管理器工作方式相似,但具体细节和使用方式有所不同。 9. **SWT与Eclipse IDE**:由于SWT是Eclipse的基础,因此如果...

    java程序设计之swt教程

    5. 深入学习JFace库,理解其提供的抽象和便利功能。 6. 尝试构建一个完整的GUI应用,如文件浏览器或者简单的数据编辑器。 在学习过程中,可以参考Eclipse官方文档、在线教程、书籍和论坛讨论,不断实践和探索,提升...

    SWT相关学习资料(多个pdf文档)

    总的来说,这些学习资料提供了全面而深入的SWT学习路径,从基础到进阶,从理论到实践,对于想要提升Java GUI开发技能,特别是涉及Eclipse RCP开发的人员来说,是一份宝贵的资源。通过系统学习,开发者不仅可以掌握...

    SWT扩展

    对于SWT的深入学习,阅读源码是一个有效的途径。了解SWT如何与操作系统进行交互,以及如何实现各种控件和功能,可以帮助开发者更好地优化应用性能,解决特定问题。 在实际项目中,SWT常用于开发桌面应用程序,尤其...

    SWT的简单实例

    下面我们将深入探讨SWT的简单实例中涉及到的知识点。 首先,我们来看标题中提到的几个关键组件: 1. **BUTTON**: BUTTON是SWT中用于创建按钮的类。按钮是GUI中最基本的交互元素,用户可以通过点击按钮来触发某个...

Global site tag (gtag.js) - Google Analytics