SWT布局(Layouts)

article/2025/9/14 4:09:44

每种类型操作系统对屏幕的定义不一样,在开发跨平台应用软件时,我们一般都会使用布局(Layout)来管理复合控件(Composite)中子控件的位置和大小。通过布局,程序员可以充分展示那些埋没已久的艺术细菌,哦不,是艺术细胞!Composite及其子类都可以设置布局,常用的有Shell,Group,TabFolder等,本文将像Composite等这类可以放置布局的控件称为布局容器,布局中的子控件称为布局子控件。

        默认情况下,在WindowBuilder添加一个布局容器并没有设置它的布局(Layout),也就是WindowBuilder里的绝对像素坐标布局(Abstract Layout)。这种布局不能使用窗口大小的变化,也不利于跨平台,一般不推荐使用。

 

       用于布局的类都扩展自抽象基类Layout。SWT提供了几种常用的布局类,在开发中基本够用,本文称之为SWT标准布局。当然,你也可以很容易的写出自己的布局类。

      下面是SWT的标准布局:

WindowBuilder Layout图

 

1. 简单才好入门——填充布局(FillLayout)

FillLayout是最简单的布局类,将子控件按一行或者一列摆列,每个子控件具有相同的尺寸,即最高子控件的高度和最宽子控件的高度。当布局容器缩小时,所有子控件也等比例缩小,而不会自动换行(列)。

天生我材必有用,再简单的FillLayout主要用于:

(1). 摆放任务栏或工具栏按钮;

(2). 堆叠中的复选框组。 

(3). 布局容器的只有一个子控件。

    布局容器的FillLayout在WindowBuilder中的设置图,

   

 Type属性:可以设置水平摆放还是竖直摆放。

    关于其它的布局属性意义,千言万语不如下图一目了然:

WindowBuilder切换到Source页可以浏览和编辑生成的代码,如下:

FillLayout fl_shlFilllayout = new FillLayout(SWT.HORIZONTAL);
fl_shlFilllayout.marginWidth = 60;
fl_shlFilllayout.spacing = 40;
fl_shlFilllayout.marginHeight = 50;
shlFilllayout.setLayout(fl_shlFilllayout);

       

2. 一横一竖走天下——行布局(RowLayout)

    RowLayout也是一行或者一列摆放,但比FillLayout更常用的,因为它有更多设置的属性,而且每个子控件可以有不同的尺寸,可以通过布局数据(RowData)独立设置。这里有两个概念需要搞清楚,布局(Layout)由布局容器(如Composite)来设置,而布局数据(如RowData)由布局子控件(如Button)来设置。

布局容器的RowLayout在WindowBuilder的设置图。

下图由WindowBuilder画出,RowLayout为默认设置,但每个子控件的尺寸经过调整。

布局属性意义见下:

Center:居中

Fill:填充,true时类似于FillLayout,false是子控件的尺寸由子控件的属性设置。

Justify:根据布局容器尺寸调整子控件之间的间距,

Pack:默认为true,子控件会使用最恰当的尺寸。当设置为false时,所有子控件等尺寸,为所有子控件的最大尺寸。

 

Wrap:默认为true,子控件会根据布局容器的大小自动换行。

若设置为false,子控件不会自动换行。

子控件(如按钮)的布局数据(RowData)属性如下图:

Exclude:当false时,子控件隐藏。下图隐藏了“Eclipse RCP”按钮:

生成的关于Eclipse RCP按钮的代码如下:

    Button btnEclipseRcp = new Button(shlRowlayouth, SWT.NONE);RowData rd_btnEclipseRcp = new RowData(SWT.DEFAULT, 74);rd_btnEclipseRcp.exclude = true;btnEclipseRcp.setLayoutData(rd_btnEclipseRcp);btnEclipseRcp.setText("Eclipse RCP");


 

3. 二维世界的首选——网格布局(Grid Layout):

    前面都是一维的布局,但用户图形界面(GUI)是二维的。一维的布局难以适应更复杂的情况。网格布局(GridLayout)是来自二维世界的布局,它将子控件放置在网格单元中。这里,我们把网格中每个单元格称为网格单元(Cell)。

 

     布局容器的布局(GridLayout)属性如下图:

     从属性的名字上,大家应该很容易明白,这里不再详细说明。下图为以上属性图所对应的界面,网格共3列,子控件间的距离在水平、竖直方向都为5个像素,边距宽度高度为5个像素。

      跟RowLayout一样,单单设置布局容器的GridLayout是不够的,每个子控件都各有特色,这需要关联各自的布局数据(GridData)。下图为文本编辑框的GridData

 

       grabExcessHorizontalSpace: 可伸缩位设置。当设置为true时,该子控件所在的网格单元填充额外的空白。本例中,文本编辑框所在的网格单元随着窗口在水平方向伸缩而伸缩。注意,这里说的是网格单元会伸缩,而不是子控件(文本编辑框)会伸缩。好绕口是吧,要知道网格单元(Cell)不等于子控件,而是放置子控件的容器。若要想让子控件(文本编辑框)随着窗口伸缩而伸缩,请往下读。

      horizontalAlignment:指的是子控件相对于网格单元的水平对齐方式,确定子控件在网格单元中的位置。可以左对齐(LEFT),右对齐(RIGHT),居中(CENTER)和填充(FILL)。本例中,标签New Label为右对齐,文本编辑框则填充(FILL)网格单元。你可以试试把文本编辑框改成其它的对齐方式(如左对齐),如下图所示:

     当窗口在水平方向伸缩时,文本编辑框不会伸缩。这多么不美观啊,你的审美第六感会告诉你:文本编辑框应该填充网格单元(horizontalAlignment = SWT.FILL),并且随着窗口伸缩而伸缩(grabExcessHorizontalSpace = true)。

    horizontalIndent:网格单元左侧缩进值,以像素为单位,用于控制子控件在网格单元中的位置。

    widthHint:布局容器刚打开时子控件的宽度,缺省值为-1,表示SWT提供的默认宽度。当水平填充(horizontalAlignment = SWT.FILL)时无效。

    minimumWidth:子控件的最小宽度,缺省值为0,表示SWT提供的默认最小宽度(非0)。只有在可伸缩(grabExcessHorizontalSpace = true)时有效。

    horizontalSpan:指定子控件在水平方向上占据多少个网格单元,默认为1。本例中第二行的组合框(Combo)就占据了2个网格单元(horizontalSpan = 2)。

    竖直方向的属性类似于水平属性,读者可以触类旁通。省点墨水,为共建节约型社会的努力!

    GridLayout很好很强大,既容易学习,又相当实用。根据我们团队多年的开发经验,除非遇到特殊的要求,总是把GridLayout作为GUI设计的首选布局,即使只有一行或者一列。

 

4. 带磁场的布局方式——窗体布局(FormLayout)

       布局的目的是为了确定子控件在布局容器中的位置,从另一个角度,我们也可以这样理解布局:如果把布局容器看成一块磁铁,每个子控件也比作磁铁,那么布局容器的每一边与子控件之间必然存在磁场,子控件与子控件之间也必然存在磁场。距离不同,磁场强度也不同。不同的布局对应于不同的磁场分布,不同的磁场分布对应不同的布局。因此,只要确定了磁场分布的各种磁场强度,就可以确定子控件在布局容器中的位置,也就是布局。我们把这种磁场强度就是某子控件的粘附值(FormAttachment),表示某子控件与布局容器、相邻子控件的距离,以像素为单位。这就是窗体布局,如下图所示。

 

       窗体布局是另外一种二维布局,它的原理是通过为子控件的上下左右每一边创建窗体粘附值(FormAttachment),并存储于该子控件的布局数据(FormData)中。有兴趣的读者可以玩一下,这里就不多介绍了。

      上图布局的设计好不好,元芳,你怎么看?

      回大人,此图必有蹊跷。虽然表面上看去很正常,普通人是看不出的,但根据属下多年来对马克思主义哲学的深刻领悟,从“运动”的角度,可以透过现象看本质。运行一下程序,调整窗口大小,很容易出现控件交叉的现象(如下图)。

     

 


http://chatgpt.dhexx.cn/article/WW5jGlHr.shtml

相关文章

SWT简介

SWT简介 1. 为什么要使用SWT?  SWT是一个IBM开发的跨平台GUI开发工具包。在SWT之前,Sun已经提供了一个跨平台GUI开发工具包AWT (Abstract Windowing Toolkit)。虽然AWT框架也使用的是原生窗口部件(native widgets),但是它一直未能突破LCD问题。LCD问…

[转]实时股票数据接口大全

from: http://www.21andy.com/blog/20090530/1313.html 实时股票数据接口大全 股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据 1.1Sina股票数据接口 以大秦铁路(股票代码:…

股票数据在线获取

推荐:使用如下地址注册tushare并分享此链接。 https://tushare.pro/register?reg133232 分享此链接,注册tushare. 以前是使用tushare等下载保存到本地数据库后进行计算分析。 现在不想维护本地数据库,想使用时直接在线获取数据。经查找如…

获取股票实时交易数据的方法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 获取股票实时交易数据的方法 注:本文为原创文章,转载时请注明转载地址。炒股有一段时间…

实时股票数据接口 (转,以防有用)

 http://blog.sina.com.cn/s/blog_510844b70102wrvf.html 实时股票数据接口 股票数据的获取目前有如下两种方法可以获取: 1. http/javascript接口取数据 2. web-service接口 1.http/javascript接口取数据1.1Sina股票数据接口 以大秦铁路(…

获取股票数据【实时更新股票数据、创建你的股票数据】、计算交易指标【买入、卖出信号、计算持仓收益、计算累计收益率】

在上一次获取股票数据【使用JQData查询行情数据、财务指标、估值指标】学习了使用JQData来查询股票相关数据, 这次则开始一点点构建咱们的量化交易系统了。 量化交易平台功能模块了解: 对于一个量化交易平台,它主要包含如下功能模块&#x…

使用Python获取股票实时数据和历史数据

决定新建一个专栏,专门研究股票数据的API接口。 由于不是混金融领域的人,百度调研了一会儿,没有找到合适的大公司维护的API接口。 yahoo-finance PyPI 这玩意架梯子都访问不到数据,不知道乍回事。许多大牛维护的pip包都是基于这…

Tushare免费获取股票数据:实时数据,历史数据,行情数据

一 操作手册 引导用户顺利开始使用Tushare Pro数据,以下步骤将带您开始Tushare数据之旅: 用户注册登录后可调用数据:https://tushare.pro/register?reg399205 二 如何获取TOKEN凭证 1、登录成功后,点击右上角->个人主页 2、…

如何用 Python 获取实时的股票数据?

这个我会!先上图 这篇回答中,我将向你展示两种不同的代码版本(加强版和一般版) 代码运行环境说明(非常重要) Python版本要求 Python 3 需要安装的库 efinance 库的安装方法是:打开 cmd&#x…

怎么用Python获取股票的实时数据?

学习目标: 应用industry实现行业股票列表的获取应用history_bars实现股票合约历史行情数据获取应用get_fundamentals实现股票基本面数据获取使用query的过滤条件完成股票数据的过滤应用scheduler定时器实现股票数据定期获取 1、 数据接口种类 获取指定行业、板块…

SAP UI5 Focus related

tap, keydown, keypresssap.ui.core.FocusHandlersap.ca.scfld.md.app.CommonHeaderFooterHelperevent new jQuery.Event(originalEvent);focusin, activate, blur, focusout, sapfocusleaveoElement._handleEvent(oEvent); 要获取更多Jerry的原创…

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI‘ in your configuration

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI’ in your configuration… 引导类加注解EnableFeignClients

Prime算法 C++实现

Prime算法 算法介绍: 课本实现方法: 先从最小堆说起(heap):任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶(即完全二叉树的根结点的位置)的结点的关键码是整个集合中最…

【数学】Prime-Factor Prime

Prime-Factor Prime 题目描述 A positive integer is called a "prime-factor prime" when the number of its prime factors is prime. For example, 12 is a prime-factor prime because the number of prime factors of 12223 is 3, which is prime. On the other…

Prime Factory (Training, Math)

Prime Factory (Training, Math) 题目描述 Your task is simple: Find the first two primes above 1 million, whose separate digit sums are also prime. As example take 23, which is a prime whose digit sum, 5, is also prime. The solution is the concatination of t…

Fiori Fundamentals和SAP UI5 Web Components

这周有位同事邀请我给团队讲一讲SAP技术的演进历史,所以我准备了下面几个主题来介绍。 其中SAP的技术回顾和演进,我的思路就是从前后台两方面分别介绍。 我画了一张非常简单的图: 去年5月我写过一篇文章:SAP UI和Salesforce UI开…

C++Prime Plus(3)

目录 51.抽象和类52.类的使用53.对象构造54.对象析构55.const与类56.this指针57.类作用域58.运算符重载59.运算符重载的实例60.友元61.运算符重载-成员或非成员62.类的类型转换63.拷贝构造函数与赋值运算符重载64.静态数据成员65.静态成员函数 51.抽象和类 类型的构成 1.数据占…

C++Prime Plus(6)

目录 92.STL(1)容器93.STL(2)迭代器94.STL(3)函数对象95.STL(4)算法 92.STL(1)容器 标准模板库 STL(Standard Template Library),是 C 标准库的一部分,不需要单独安装,只需要#include 头文件。STL提供了容器&#xff…

C++Prime Plus(5)

目录 85.异常(1)异常处理机制86.异常(2)exception类87.RTTI(1)88.RTTI(2)89.类型转换运算符90.string类91.智能指针 85.异常(1)异常处理机制 异常:运行错误(比如无法打开文件,动态内存申请失败),导致程序无法继续正常…

SAP Fiori学习笔记

资料链接:有些是需要自带梯子的哦~ Fiori Design Guidelines​experience.sap.com戴团长:SAP Fiori Design​zhuanlan.zhihu.com如何评价 SAP Fiori Design Guidelines?​www.zhihu.comhttps://mp.weixin.qq.com/s?__bizMzIyNjY…