用java读取text文件内容 swt text显示字符串内容,但在text中 为什么格式是不对齐的呢?但在控制台上显示就是整齐的

摘要(Abstract)
本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程。
前言(Prologue)
Sublime Text是一款跨平台代码编辑器(Code Editor),从最初的Sublime Text 1.0,到现在的Sublime Text 3.0,Sublime Text从一个不知名的编辑器演变到现在几乎是各平台首选的GUI编辑器。而这样优秀的编辑器却没有一个靠谱的中文教程,所以我试图通过本文弥补这个缺陷。
编辑器的选择(Editor Choices)
从初学编程到现在,我用过的编辑器有EditPlus、UltraEdit、Notepad++、Vim、TextMate和Sublime Text,如果让我从中推荐,我会毫不犹豫的推荐Vim和Sublime Text,原因有下面几点:
跨平台:Vim和Sublime Text均为跨平台编辑器(在Linux、OS X和Windows下均可使用)。作为一个,切换系统是常有的事情,为了减少重复学习,使用一个跨平台的编辑器是很有必要的。
可扩展:Vim和Sublime Text都是可扩展的(Extensible),并包含大量实用插件,我们可以通过安装自己领域的插件来成倍。
互补:Vim和Sublime Text分别是命令行环境(CLI)和图形界面环境(GUI)下的最佳选择,同时使用两者会大大提高工作效率。
个人背景(Personal Background)
我是一名非常典型的程序员:平时工作主要在Linux环境下使用Java和Python,偶尔会用HTML+CSS+JavaScript编写网页;业余时会在Windows环境编写一些C#程序(包括控制台程序(Console Application)和移动应用(Mobile App),也会玩一些非主流语言(比如Haskell,ML和Ruby等)以拓展见识。
所以这篇文章会我的个人工作内容为主要使用场景(Scenario),尽管无法覆盖到所有的使用场景,但我认为依然可以覆盖到绝大部分,如果您认为我遗漏了什么内容,请在文章下面回复,我会尽量更新。
本文风格(Writing Style)
受益于K&R C的写作风格,我倾向于以实际案例来讲解Sublime Text的功能,所以本文中的例子均源于我在实际开发时遇到的问题。
此外,把本文会使用大量动画(GIF)演示Sublime Text的编辑功能,因为我发现图片难以演示完整的编辑流程(Workflow),而视频又过于重量级。本文的GIF动画均使用ScreenToGif进行录制。
编辑器(Editor) vs 集成开发环境(Integrated Development Environment,下文简称IDE)
我经常看到一些程序员拿编辑器和IDE进行比较,诸如Vim比Eclipse强大或是Visual Studio太慢不如Notepad++好使之类的讨论比比皆是,个人认为这些讨论没有意义,因为编辑器和IDE根本是面向两种不同使用场景的工具:
编辑器面向无语义的纯文本,不涉及领域逻辑,因此速度快体积小,适合编写单独的配置文件和动态语言脚本(Shell、Python和Ruby等)。
IDE面向有语义的代码,会涉及到大量领域逻辑,因此速度偏慢体积庞大,适合编写静态语言项目(Java、C++和C#等)。
我认为应当使用正确的工具去做有价值的事情,并把效率最大化,所以我会用Eclipse编写Java项目,用Vim编写Shell,用Sublime Text编写JavaScript/HTML/Python,用Visual Studio编写C#。
前言到此结束,下面进入正题。
安装(Installation)
Sublime Text官方网站提供了Sublime Text各系统各版本的下载,目前Sublime Text的最新版本是。这里以Windows版本的Sublime Text安装为例。
注意在安装时勾选Add to explorer context menu,这样在右键单击文件时就可以直接使用Sublime Text打开。
添加Sublime Text到环境变量
使用Win + R运行sysdm.cpl打开“系统属性”。
然后在“高级”选项卡里选择“环境变量”,编辑“Path”,增加Sublime Text的安装目录(例如D:\Program Files\Sublime Text 3)。
接下来你就可以在命令行里面利用subl命令直接使用Sublime Text了:
subl file :: 使用Sublime Text打开file文件
subl folder :: 使用Sublime Text打开folder文件夹
subl . :: 使用Sublime Text当前文件夹
安装Package Control
前文提到Sublime Text支持大量插件,如何找到并管理这些插件就成了一个问题,Package Control正是为了解决这个问题而出现的,利用它我们可以很方便的浏览、安装和卸载Sublime Text中的插件。
进入Package Control的官网,里面有详细的安装教程。Package Control支持Sublime Text 2和3,本文只给出3的安装流程:
使用Ctrl + `打开Sublime Text控制台。
将下面的代码粘贴到控制台里:
import urllib.request,os, h = 'e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
等待Package Control安装完成。之后使用Ctrl + Shift + P打开命令板,输入PC应出现Package Control:
成功安装Package Control之后,我们就可以方便的安装使用Sublime Text的各种插件:
购买(Purchase)
Sublime Text是一个收费闭源软件,这在一定程度上成为了我支持Sublime Text的理由(我心中的软件靠谱程度:免费开源 && 免费闭源 & 收费开源 & 收费闭源):在购买。
不过不购买Sublime Text也可以“正常”使用它,只是Sublime Text会时不时的弹出一个对话框提醒你购买,此外窗口处会有一个很屌丝很low逼的(UNREGISTERED)。(在高频操作下,一般20分钟提示一次,个人认为算是很厚道了)
也许不少人会觉着Sublime Text 70刀的价格太贵,但相比它的功能和带来的效率提升,70刀真的不值一提,如果你不方便使用Paypal付款可以邮件联系我,你支付宝给我打款然后我帮你付款,价格按当日汇率折算(450元左右)。
概览(Tour)
基本概念(Basic Concepts)
Sublime Text的界面如下:
标签(Tab):无需介绍。
编辑区(Editing Area):无需介绍。
侧栏(Side Bar):包含当前打开的文件以及文件夹视图。
缩略图(Minimap):如其名。
命令板(Command Palette):Sublime Text的操作中心,它使得我们基本可以脱离鼠标和菜单栏进行操作。
控制台(Console):使用Ctrl + `调出,它既是一个标准的Python REPL,也可以直接对Sublime Text进行配置。
状态栏(Status Bar):显示当前行号、当前语言和Tab格式等信息。
配置(Settings)
与其他GUI环境下的编辑器不同,Sublime Text并没有一个专门的配置界面,与之相反,Sublime Text使用JSON配置文件,例如:
"font_size": 12,
"highlight_line": true,
会将默认字体大小调整为12,并高亮当前行。
JSON配置文件的引入简化了Sublime Text的界面,但也使得配置变的复杂,一般我会到这里查看可用的Sublime Text配置。
编辑(Editing)
Sublime Text的编辑十分人性化——它不像Vim那样反人类(尽管我也用Vim但我还是要说Vim的快捷键设定绝壁连代谢产物都不如),少量的快捷键就可以完成绝大多数编辑任务。
基本编辑(Basic Editing)
↑↓←→就是↑↓←→,不是KJHL,(没错我就是在吐槽Vim,尼玛设成WSAD也比这个强啊),粘贴剪切复制均和系统一致。
Ctrl + Enter在当前行下面新增一行然后跳至该行;Ctrl + Shift + Enter在当前行上面增加一行并跳至该行。
Ctrl + ←/→进行逐词移动,相应的,Ctrl + Shift + ←/→进行逐词选择。
Ctrl + ↑/↓移动当前显示区域,Ctrl + Shift + ↑/↓移动当前行。
选择(Selecting)
Sublime Text的一大亮点是支持多重选择——同时选择多个区域,然后同时进行编辑。
Ctrl + D选择当前光标所在的词并高亮该词所有出现的位置,再次Ctrl + D选择该词出现的下一个位置,在多重选词的过程中,使用Ctrl + K进行跳过,使用Ctrl + U进行回退,使用Esc退出多重编辑。
多重选词的一大应用场景就是重命名——从而使得代码更加整洁。尽管Sublime Text无法像IDE(例如Eclipse)那样进行自动重命名,但我们可以通过多重选词+多重编辑进行直观且便捷的重命名:
有时我们需要对一片区域的所有行进行同时编辑,Ctrl + Shift + L可以将当前选中区域打散,然后进行同时编辑:
有打散自然就有合并,Ctrl + J可以把当前选中区域合并为一行:
查找&替换(Finding&Replacing)
Sublime Text提供了强大的查找(和替换)功能,为了提供一个清晰的介绍,我将Sublime Text的查找功能分为快速查找、标准查找和多文件查找三种类型。
快速查找&替换
多数情况下,我们需要查找文中某个关键字出现的其它位置,这时并不需要重新将该关键字重新输入一遍然后搜索,我们只需要使用Shift + ←/→或Ctrl + D选中关键字,然后F3跳到其下一个出现位置,Shift + F3跳到其上一个出现位置,此外还可以用Alt + F3选中其出现的所有位置(之后可以进行多重编辑,也就是快速替换)。
标准查找&替换
另一种常见的使用场景是搜索某个已知但不在当前显示区域的关键字,这时可以使用Ctrl + F调出搜索框进行搜索:
以及使用Ctrl + H进行替换:
关键字查找&替换
对于普通用户来说,常规的关键字搜索就可以满足其需求:在搜索框输入关键字后Enter跳至关键字当前光标的下一个位置,Shift + Enter跳至上一个位置,Alt + Enter选中其出现的所有位置(同样的,接下来可以进行快速替换)。
Sublime Text的查找有不同的模式:Alt + C切换大小写敏感(Case-sensitive)模式,Alt + W切换整字匹配(Whole matching)模式,除此之外Sublime Text还支持在选中范围内搜索(Search in selection),这个功能没有对应的快捷键,但可以通过以下配置项自动开启。
"auto_find_in_selection": true
这样之后在选中文本的状态下范围内搜索就会自动开启,配合这个功能,局部重命名(Local Renaming)变的非常方便:
使用Ctrl + H进行标准替换,输入替换内容后,使用Ctrl + Shift + H替换当前关键字,Ctrl + Alt + Enter替换所有匹配关键字。
正则表达式查找&替换
正则表达式是非常强大的文本查找&替换工具,Sublime Text中使用Alt + R切换正则匹配模式的开启/关闭。Sublime Text的使用。
出于篇幅原因,本文不会对正则表达式进行详细介绍,Mastering Regex(中译本:)对正则表达式的原理和各语言下的使用进行了详细介绍。此外网上有大量正则表达式的优秀教程(“”和.aspx)),以及在线测试工具(和)。
多文件搜索&替换
使用Ctrl + Shift + F开启多文件搜索&替换(注意此快捷键和搜狗输入法的简繁切换快捷键有冲突):
多文件搜索&替换默认在当前打开的文件和文件夹进行搜索/替换,我们也可以指定文件/文件夹进行搜索/替换。
跳转(Jumping)
Sublime Text提供了强大的跳转功能使得我们可以在不同的文件/方法/函数中无缝切换。就我的使用经验而言,目前还没有哪一款编辑器可以在这个方面超越Sublime Text。
跳转到文件
Ctrl + P会列出当前打开的文件(或者是当前文件夹的文件),输入文件名然后Enter跳转至该文件。
需要注意的是,Sublime Text使用模糊字符串匹配(Fuzzy String Matching),这也就意味着你可以通过文件名的前缀、首字母或是某部分进行匹配:例如,EIS、Eclip和Stupid都可以匹配EclipseIsStupid.java。
跳转到符号
尽管是一个,Sublime Text能够对代码符号进行一定程度的索引。Ctrl + R会列出当前文件中的符号(例如类名和函数名,但无法深入到变量名),输入符号名称Enter即可以跳转到该处。此外,还可以使用F12快速跳转到当前光标所在符号的定义处(Jump to Definition)。
比较有意思的是,对于Markdown,Ctrl + R会列出其大纲,非常实用。
跳转到某行
Ctrl + G然后输入行号以跳转到指定行:
在Ctrl + P匹配到文件后,我们可以进行后续输入以跳转到更精确的位置:
@ 符号跳转:输入@symbol跳转到symbol符号所在的位置
# 关键字跳转:输入#keyword跳转到keyword所在的位置
: 行号跳转:输入:12跳转到文件的第12行。
所以Sublime Text把Ctrl + P称之为“Go To Anything”,这个功能如此好用,以至于我认为没有其它编辑器能够超越它。
中文输入法的问题
从Sublime Text的初版(1.0)到现在(3.0 3065),中文输入法(包括日文输入法)都有一个问题:输入框不跟随。
目前官方还没有修复这个bug,解决方法是安装IMESupport插件,之后重启Sublime Text问题就解决了。
文件夹(Folders)
Sublime Text支持以文件夹做为单位进行编辑,这在编辑一个文件夹下的代码时尤其有用。在File下Open Folder:
你会发现右边多了一个侧栏,这个侧栏列出了当前打开的文件和文件夹的文件,使用Ctrl + K, Ctrl + B显示或隐藏侧栏,使用Ctrl + P快速跳转到文件夹里的文件。
窗口&标签(Windows & Tabs)
Sublime Text是一个多窗口多标签编辑器:我们既可以开多个Sublime Text窗口,也可以在一个Sublime Text窗口内开多个标签。
窗口(Window)
使用Ctrl + Shift + N创建一个新窗口(该快捷键再次和搜狗输入法快捷键冲突,个人建议禁用所有搜狗输入法快捷键)。
当窗口内没有标签时,使用Ctrl + W关闭该窗口。
标签(Tab)
使用Ctrl + N在当前窗口创建一个新标签,Ctrl + W关闭当前标签,Ctrl + Shift + T恢复刚刚关闭的标签。
编辑代码时我们经常会开多个窗口,所以分屏很重要。Alt + Shift + 2进行左右分屏,Alt + Shift + 8进行上下分屏,Alt + Shift + 5进行上下左右分屏(即分为四屏)。
分屏之后,使用Ctrl + 数字键跳转到指定屏,使用Ctrl + Shift + 数字键将当前屏移动到指定屏。例如,Ctrl + 1会跳转到1屏,而Ctrl + Shift + 2会将当前屏移动到2屏。
全屏(Full Screen)
Sublime Text有两种全屏模式:普通全屏和无干扰全屏。
个人强烈建议在开启全屏前关闭菜单栏(Toggle Menu),否则全屏效果会大打折扣。
F11切换普通全屏:
Shift + F11切换无干扰全屏:
风格(Styles)
风格对于任何软件都很重要,对编辑器也是如此,尤其是GUI环境下的编辑器。作为一个程序员,我希望我的编辑器足够简洁且足够个性。
Notepad++默认界面
Sublime Text默认界面
所以在用过Sublime Text之后,我立刻就卸掉了Notepad++。
Sublime Text自带的风格是我喜欢的深色风格(也可以调成浅色),默认主题是Monokai Bright,这两者的搭配已经很不错了,不过我们还可以做得更好:接下来我将会展示如何通过设置偏好项和添加自定义风格/主题使得Sublime Text更加Stylish。
一些设置(Miscellaneous Settings)
下面是我个人使用的设置项。
设置之后的效果如下:
主题(Themes)
Sublime Text有大量第三方主题:[],这里我给出几个个人感觉不错的主题:
配色(Color)
包含了大量Sublime Text配色方案,并支持在线预览,配色方案的安装教程在,恕不赘述。
我个人使用的是主题和配色,配置如下:
"theme": "Nexus.sublime-theme",
"color_scheme": "Packages/Theme - Flatland/Flatland Dark.tmTheme",
效果如下:
编码(Coding)
优秀的编辑器使编码变的更加容易,所以Sublime Text提供了一系列功能以提高开发效率。
良好实践(Good Practices)
良好的代码应该是规范的,所以Google为每一门主流语言都设置了其代码规范(Code Style Guideline)。我自己通过下面的设置使以规范化自己的代码。
代码段(Code Snippets)
Sublime Text支持代码段(Code Snippet),输入代码段名称后Tab即可生成代码段。
你可以通过Package Control安装第三方代码段,也可以自己创建代码段,参考这里。
格式化(Formatting)
Sublime Text基本的手动格式化操作包括:Ctrl + [向左缩进,Ctrl + ]向右缩进,此外Ctrl + Shift + V可以以当前缩进粘贴代码(非常实用)。
除了手动格式化,我们也可以通过安装插件实现自动缩进和智能对齐:
:格式化HTML。
:格式化Python代码。
:进行智能对齐。
自动完成(Auto Completion)
Sublime Text 支持一定的自动完成,按Tab自动补全。
括号(Brackets)
编写代码时会碰到大量的括号,利用Ctrl + M可以快速的在起始括号和结尾括号间切换,Ctrl + Shift + M则可以快速选择括号间的内容,对于缩进型语言(例如Python)则可以使用Ctrl + Shift + J。
此外,我使用插件以高亮显示配对括号以及当前光标所在区域,效果如下:
命令行(Command Line)
尽管提供了Python控制台,但Sublime Text的控制台仅支持单行输入,十分不方便,所以我使用SublimeREPL以进行一些编码实验(Experiments)。
其它(Miscellaneous)
尽管我试图在本文包含尽可能多的Sublime Text实用技能,但受限于篇幅和我的个人经验,本文仍不免有所遗漏,欢迎在评论里指出本文的错误及遗漏。
下面是一些可能有用但我很少用到的功能:
宏(Macro):Sublime Text支持录制宏,但我在实际工作中并未发现宏有多大用处。
其它平台(Other Platforms):本文只介绍了Windows平台上Sublime Text的使用,不过Linux和OS X上Sublime Text的使用方式和Windows差别不大,只是在快捷键上有所差异,请参考Windows/Linux快捷键和OS X快捷键。
项目(Projects):Sublime Text支持简单的项目管理,但我一般只用到文件夹。
Vim模式(Vintage):Sublime Text自带Vim模式。
构建(Build):通过配置,Sublime Text可以进行源码构建。
调试(Debug):通过安装插件,Sublime Text可以对代码进行调试。
快捷键列表(Shortcuts Cheatsheet)
我把本文出现的Sublime Text按其类型整理在这里,以便查阅。
通用(General)
↑↓←→:上下左右移动光标,注意不是不是KJHL!
Alt:调出菜单
Ctrl + Shift + P:调出命令板(Command Palette)
Ctrl + `:调出控制台
编辑(Editing)
Ctrl + Enter:在当前行下面新增一行然后跳至该行
Ctrl + Shift + Enter:在当前行上面增加一行并跳至该行
Ctrl + ←/→:进行逐词移动
Ctrl + Shift + ←/→进行逐词选择
Ctrl + ↑/↓移动当前显示区域
Ctrl + Shift + ↑/↓移动当前行
选择(Selecting)
Ctrl + D:选择当前光标所在的词并高亮该词所有出现的位置,再次Ctrl + D选择该词出现的下一个位置,在多重选词的过程中,使用Ctrl + K进行跳过,使用Ctrl + U进行回退,使用Esc退出多重编辑
Ctrl + Shift + L:将当前选中区域打散
Ctrl + J:把当前选中区域合并为一行
Ctrl + M:在起始括号和结尾括号间切换
Ctrl + Shift + M:快速选择括号间的内容
Ctrl + Shift + J:快速选择同缩进的内容
Ctrl + Shift + Space:快速选择当前作用域(Scope)的内容
查找&替换(Finding&Replacing)
F3:跳至当前关键字下一个位置
Shift + F3:跳到当前关键字上一个位置
Alt + F3:选中当前关键字出现的所有位置
Ctrl + F/H:进行标准查找/替换,之后:
Alt + C:切换大小写敏感(Case-sensitive)模式
Alt + W:切换整字匹配(Whole matching)模式
Alt + R:切换正则匹配(Regex matching)模式
Ctrl + Shift + H:替换当前关键字
Ctrl + Alt + Enter:替换所有关键字匹配
Ctrl + Shift + F:多文件搜索&替换
跳转(Jumping)
Ctrl + P:跳转到指定文件,输入文件名后可以:
@ 符号跳转:输入@symbol跳转到symbol符号所在的位置
# 关键字跳转:输入#keyword跳转到keyword所在的位置
: 行号跳转:输入:12跳转到文件的第12行。
Ctrl + R:跳转到指定符号
Ctrl + G:跳转到指定行号
窗口(Window)
Ctrl + Shift + N:创建一个新窗口
Ctrl + N:在当前窗口创建一个新标签
Ctrl + W:关闭当前标签,当窗口内没有标签时会关闭该窗口
Ctrl + Shift + T:恢复刚刚关闭的标签
屏幕(Screen)
F11:切换普通全屏
Shift + F11:切换无干扰全屏
Alt + Shift + 2:进行左右分屏
Alt + Shift + 8:进行上下分屏
Alt + Shift + 5:进行上下左右分屏
分屏之后,使用Ctrl + 数字键跳转到指定屏,使用Ctrl + Shift + 数字键将当前屏移动到指定屏
延伸阅读(Further Reading)
书籍(Books)
:我读过的唯一一本关于Sublime Text的书籍,书中介绍的插件很实用,但对编辑技巧介绍不全。
:另外一本关于Sublime Text的书,我没有读过。
链接(Links)
官方文档:
官方论坛:
Stack Overflow的Sublime Text频道:
非官方文档:甚至比官方文档还要全面!
Package Control:大量的Sublime Text插件和主题。
视频(Videos)
Getting Started with SublimeText:
Sublime Text Pefect Workflow:
阅读(...) 评论()下次自动登录
现在的位置:
& 综合 & 正文
JAVA.SWT/JFace: 面板容器类/SWT布局管理器
《Eclipse SWT/JFACE 核心应用》 清华大学出版社 6 面板容器类
所有容器类的父类:Composite类。
容器类:分组框(Group)、选项卡(TabFolder)、自定义选项卡(CTabFolder)、分割窗框(SashForm)、自定义分割框(CBanner)、滚动面板(ScrolledComposite)和ViewForm。
6.1 面板类(Composite)
面板类的样式:
SWT.NONE:没有边框的面板
SWT.BORDER:带有边框的面板
SWT.NO_RADIO_GROUP:对于一组单选按钮,可以同时选中多个按钮
面板类的常用方法:
获得面板中所有控件的方法:Control[] getChildren()
获得面板的父面板:Composite getParent()
设置面板布局:setLayout(Layout)
刷新布局:layout()
6.2 分组框(Group)
Group group = new Group(shell, SWT.SHADOW_ETCHED_OUT);
group.setText("分组框");
group.setLayout(new RowLayout());
Group类可以选择的样式常量有:SWT.SHADOW_ETCHED_IN、SWT.SHADOW_ETCHED_OUT、SWT.SHADOW_IN、SWT.SHADOW_OUT、SWT.SHADOW_NONE。
6.3 选项卡(TabFolder)
final TabFolder tabFolder = new TabFolder(shell,
tabFolder.setLayout(new FillLayout());
for (int i = 0; i & 4; i++) {
TabItem item = new TabItem(tabFolder, SWT.NONE);
item.setText("选项卡 " + i);
Text t = new Text(tabFolder, SWT.MULTI);
t.setText("这是第 " + i + " 页");
item.setControl(t);
tabFolder.pack();
显示效果:
选项卡的位置放在底部:final TabFolder tabFolder = new TabFolder(shell, SWT.BOTTOM);显示效果:
选项卡的常用方法:
设置选项卡图标:setImage()
获得指定索引的选项卡:TabItem getItem(index)
获得选项卡的总数:getItemCount()
获得选项卡数组:getItems()
获得当前选中的选项卡:getSelection()
获得当前选中选项卡的索引值:getSelectionIndex()查找是否存在指定的选项:indexOf(TabItem item)
设置选中指定的选项卡:setSelection()
6.4 自定义选项卡(CTabFolder)
CTabFolder由多个CTabItem对应。
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabF
import org.eclipse.swt.custom.CTabI
import org.eclipse.swt.layout.FillL
import org.eclipse.swt.layout.RowL
import org.eclipse.swt.widgets.D
import org.eclipse.swt.widgets.S
import org.eclipse.swt.widgets.T
public class testCTabFolder {
* @param args
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(300, 200);
shell.setLayout(new FillLayout());
shell.setText("自定义选项卡");
// 选项卡样式:带有“关闭”按钮、带有边框
final CTabFolder tabFolder = new CTabFolder(shell, SWT.TOP | SWT.CLOSE | SWT.BORDER);
tabFolder.setTabHeight(20);
tabFolder.setLayout(new FillLayout());
tabFolder.marginHeight = 10;
tabFolder.marginWidth = 10;
// 显示“最大化、最小化”按钮
tabFolder.setMaximizeVisible(true);
tabFolder.setMinimizeVisible(true);
for (int i = 0; i & 4; i++) {
CTabItem item = new CTabItem(tabFolder, SWT.NONE);
item.setText("选项卡 " + i);
Text t = new Text(tabFolder, SWT.MULTI);
t.setBounds(5, 5, 150, 150);
t.setText("这是第 " + i + " 页");
item.setControl(t);
tabFolder.pack();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
display.dispose();
显示效果:
// 设置单一的前景色和背景色
tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));
tabFolder.setSelectionBackground(display.getSystemColor(SWT.COLOR_BLUE));显示效果:
tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));
// 设置渐变的背景色
Color[] color = new Color[4];
color[0] = display.getSystemColor(SWT.COLOR_DARK_BLUE);
color[1] = display.getSystemColor(SWT.COLOR_BLUE);
color[2] = display.getSystemColor(SWT.COLOR_WHITE);
color[3] = display.getSystemColor(SWT.COLOR_WHITE);
int[] intArray = new int[] {25, 50, 100};
tabFolder.setSelectionBackground(color, intArray);显示效果:
// 设置选项卡背景图片
tabFolder.setSelectionBackground(new Image(display, "F:\\background.gif"));显示效果:
若同时设置背景颜色和背景图片,只显示背景图片,而设置的颜色不起作用。
仿Eclipse编辑区的选项卡:
import org.eclipse.swt.SWT;
public class EclipseTabSample {
public static void main(String[] args) {
Display display = new Display();
// 创建图片对象,该图片对象设置选项卡上的图标
Image image = new Image(
"F:\\samples.gif");
final Shell shell = new Shell(display);
shell.setText("仿Eclipse编辑区的选项卡");
shell.setLayout(new GridLayout());
// 创建自定义选项卡对象
final CTabFolder folder = new CTabFolder(shell, SWT.BORDER);
// 设置选项卡的布局,通过布局的设置呈现出最大化和最小化的外观
folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
// 设置复杂的选项卡,也就是带有圆角的选项卡标签
folder.setSimple(false);
// 设置未选中标签,图标和关闭按钮的状态
folder.setUnselectedImageVisible(true);
folder.setUnselectedCloseVisible(true);
// 设置前景色和背景色
folder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));
folder.setSelectionBackground(display.getSystemColor(SWT.COLOR_BLUE));
// 显示最大化和最小化按钮
folder.setMinimizeVisible(true);
folder.setMaximizeVisible(true);
// 创建选项卡标签对象
for (int i = 1; i & 5; i++) {
CTabItem item = new CTabItem(folder, SWT.CLOSE);
item.setText("选项卡 " + i);
item.setImage(image);
// 每个选项卡中放置一个Text文本框
Text text = new Text(folder, SWT.MULTI | SWT.V_SCROLL
| SWT.H_SCROLL);
// 文本框中的文字带有\n表示,显示时换到下一行
text.setText("这是第" + i + "页:\n该选项卡仿照Eclipse设计\n最大化和最小化按钮都可以使用");
item.setControl(text);
// 注册选项卡事件
folder.addCTabFolder2Listener(new CTabFolder2Adapter() {
// 当单击最小化按钮时触发的事件
public void minimize(CTabFolderEvent event) {
// 设置选项卡的状态为最小化,选项卡的状态决定显示在右上角的窗口按钮
folder.setMinimized(true);
// 改变选项卡的布局,呈现最小化状态
folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
// 刷新布局,否则重新设置的布局将不起作用
shell.layout(true);
// 当单击最大化按钮时触发的事件
public void maximize(CTabFolderEvent event) {
folder.setMaximized(true);
folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
shell.layout(true);
// 当单击还原按钮时触发的事件
public void restore(CTabFolderEvent event) {
folder.setMinimized(false);
folder.setMaximized(false);
folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
shell.layout(true);
shell.setSize(300, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
// 释放图片资源
image.dispose();
display.dispose();
}显示效果:
实现该的关键点:
1. folder.setSimple(false):选项卡的外观以圆角形式显示。
2. “最大化”、“最小化”按钮事件的处理:
folder.addCTabFolder2Listener(new CTabFolder2Adapter() {
// 当单击最小化按钮时触发的事件
public void minimize(CTabFolderEvent event) {
// 当单击最大化按钮时触发的事件
public void maximize(CTabFolderEvent event) {
// 当单击还原按钮时触发的事件
public void restore(CTabFolderEvent event) {
3. 最大化和最小化界面的外观的实现原理
最大化和最小化界面的改变是通过改变布局来实现的。
4. 选项卡的有关状态:
是否最小化:getMinimized()
是否最大化:getMaxmized()
设置是否最小化:setMinimized()
设置是否最大化:setMaxmized()
限制选项卡文字的长度
// 限制选项卡文字的长度
folder.setMinimumCharacters(2);显示效果:设置右上角控件
除了“最大化”和“最小化”按钮外,还可以将一个控件设置在右上角。通常情况下,放置在右上角的控件可以是“关闭”按钮或者一个菜单。
// 设置右上角的控件
Button button = new Button(tabFolder, SWT.ARROW | SWT.RIGHT);
tabFolder.setTopRight(button);显示效果:
设置按钮充满整个右上角区域:
// 设置右上角的控件
Button button = new Button(tabFolder, SWT.ARROW | SWT.RIGHT);
tabFolder.setTopRight(button, SWT.FILL);如果此时想取消右上角的控件,只需设置控件为“null”即可:
tabFolder.setTopRight(null);自定义选项的常用方法:
设置是否显示边框:setBorderVisible()
设置选项卡字体:setFont()
设置选项卡高度:setTabHeight()
设置选项卡的位置:setTabPosition(),默认为显示在上方。SWT.BOTTOM:显示在下方,SWT.TOP:显示在上方。
6.5 分割窗框(SashForm)
分割窗框将屏幕的区域分成几个部分,并且能够拖动窗框来改变窗口的大小。
import org.eclipse.swt.SWT;
public class SashFormSample {
public static void main(String[] args) {
final Display display = new Display ();
Shell shell = new Shell(display);
shell.setLayout (new FillLayout());
shell.setText("SashForm");
//创建窗框对象,设置样式为水平排列
SashForm form = new SashForm(shell,SWT.HORIZONTAL|SWT.BORDER);
form.setLayout(new FillLayout());
//创建窗口1的面板
Composite child1 = new Composite(form,SWT.NONE);
child1.setLayout(new FillLayout());
new Text(child1,SWT.MULTI).setText("窗口1");
//创建窗口2的面板
Composite child2 = new Composite(form,SWT.NONE);
child2.setLayout(new FillLayout());
new Text(child2,SWT.MULTI).setText("窗口2");
//设置初始状态两个面板所占的比例
form.setWeights(new int[] {30,70});
//form.setMaximizedControl( child1 );
//form.setMaximizedControl( null );
shell.setSize( 200,150);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
display.dispose ();
显示效果:
分割窗框的样式:
平滑外观的窗框:
SashForm form = new SashForm(shell,SWT.HORIZONTAL|SWT.SMOOTH);显示效果:
将窗口放置的位置改为垂直放置:
SashForm form = new SashForm(shell,SWT.VERTICAL|SWT.SMOOTH);显示效果:
设置窗框显示的比例:form.setWeights(new int[]{30, 30, 40}); // 三个窗口从左到右所占的空间比例分别为30%、30%、40%
设置控件填充整个form:
form.setMaximizedControl(folder);
将最大化显示的控件置为null:
form.setMaximizedControl(null);
6.6 自定义分割框(CBanner)
自定义分割框有3个控件,分别放在窗口的左侧(left)、右侧(right)和底部(bottom)。左侧和右侧的窗口可以改变大小,但底部的大小是不可以变化的。package ;
import org.eclipse.swt.SWT;
public class CBannerSample {
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("CBanner");
// 创建CBanner对象
CBanner banner = new CBanner(shell, SWT.BORDER);
banner.setLayout(new FillLayout());
// 创建三个面板,分别放置到左侧,右侧和底部
Composite left = new Composite(banner, SWT.NONE);
left.setLayout(new FillLayout());
new Text(left, SWT.MULTI).setText("左侧");
Composite right = new Composite(banner, SWT.NONE);
right.setLayout(new FillLayout());
new Text(right, SWT.MULTI).setText("右侧");
Composite bottom = new Composite(banner, SWT.NONE);
bottom.setLayout(new FillLayout());
new Text(bottom, SWT.MULTI).setText("下部");
// 设置左侧的控件
banner.setLeft(left);
// 设置右侧的控件
banner.setRight(right);
// 设置底部的控件
banner.setBottom(bottom);
banner.setSimple(false);
shell.setSize(200, 150);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
display.dispose();
显示效果:banner.setSimple(false); // 改变左右窗框分割线的外观
6.7 滚动面板(ScrolledComposite)
滚动面板:带有垂直滚动条和水平滚动条的面板。package ;
import org.eclipse.swt.SWT;
public class ScrolledCompositeSample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("ScrolledComposite");
// 创建一个滚动面板对象
final ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
// 创建一个普通的面板
final Composite c = new Composite(sc, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 4;
c.setLayout(layout);
for (int i = 0; i & 20; i++) {
Button bt = new Button(c, SWT.PUSH);
bt.setText("按钮" + i);
c.puteSize(SWT.DEFAULT, SWT.DEFAULT));
// 将普通面板设置为受控的滚动面板
sc.setContent(c);
// sc.setAlwaysShowScrollBars( true );
// sc.setExpandHorizontal( true );
shell.setSize(200, 150);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
display.dispose();
显示效果:
设置是否总是显示滚动条:setAlwaysShowScrollBars()
设置水平滚动条是否显示:setExpandHorizontal()
设置垂直滚动条是否显示:setExpandVertical()
设置最小显示滚动条的高度:setMinHeight()
设置最小显示滚动条的宽度:setMinWidth()
设置最小显示滚动条的高度和宽度:setMinSize(),只有当设置了setExpandVertical(true)和setExpandHorizontal(true)后才起作用。
《Eclipse SWT/JFACE 核心应用》 清华大学出版社 7 SWT布局管理器
7.1 布局管理器概述
FillLayout(充满式布局):在单行或单列中放置相同大小的控件,是最简单的布局。
RowLayout(行列式布局):在单行或者多行中放置控件,应用了fill、wrap和spacing等选项。
GridLayout(网格式布局):向表格一样放置控件。
FormLayout(表格式布局):与GridLayout功能差不多的布局,可以通过定义4个边的“附加值”来放置控件。
StackLayout(堆栈式布局):类似堆栈式的布局,只显示最上方的控件。
7.2 FillLayout(充满式布局)
规则:试图填充一行或一列,尽可能的充满整个面板,并且强制所有控件平均分配大小。FillLayout不会自动执行,也不能设置每个控件之间的空隙,但能够指定面板的四周的空白。
FillLayout layout = new FillLayout(SWT.VERTICAL);
FillLayout layout = new FillLayout();
layout.type = SWT.VERTICAL; // 默认为:SWT.HORIZONTAL
水平填充(SWT.HORIZONTAL):
垂直填充(SWT.VERTICAL):
设置四周补白:
FillLayout layout = new FillLayout();
layout.type=SWT.VERTICAL;
layout.marginHeight = 10; // 设置上下补白高度
layout.marginWidth = 20; // 设置左右
layout.spacing = 5;
// 设置控件之间的空隙
shell.setLayout( layout );
显示效果:
7.3 RowLayout(行列式布局)
RowLayout填充控件时可以折行显示,并且可以使用RowData设置某一个指定控件的大小。package ;
import org.eclipse.swt.SWT;
public class RowLayoutSample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display, SWT.SHELL_TRIM);
RowLayout layout = new RowLayout();
layout.type = SWT.HORIZONTAL;// 设置水平填充
layout.marginLeft = 5;// 左补白
layout.marginTop = 5;// 上补白
layout.marginRight = 5;// 右补白
layout.marginBottom = 5;// 下补白
layout.spacing = 2;// 控件的间隙
layout.wrap =// 是否折行显示
layout.pack =// false:控件平均分配大小
layout.justify =// 是否充满整个一行
shell.setLayout(layout);
new Button(shell, SWT.NONE).setText("B1");
new Button(shell, SWT.NONE).setText("Button2");
new Button(shell, SWT.NONE).setText("Wide Button3");
new Button(shell, SWT.NONE).setText("B4");
shell.layout();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
display.dispose();
显示效果:
设置控件的大小://
layout.pack =// false:控件平均分配大小
Button b = new Button(shell, SWT.NONE);
b.setText("RowData");
b.setLayoutData(new RowData(100, 30));
显示效果:设置是否等宽或等高:fill属性
当以水平方式填充时,fill属性试图使所用控件具有同样高度;当以垂直方式显示时,试图使用所有控件具有同样宽度。
水平填充,设置等高:layout.fill =
垂直填充,设置等宽:layout.fill =
7.4 GridLayout(网格式布局)
使用GridLayout布局,控件将会按照网格的方式进行填充。GridLayout所放置的控件可以有一个关联的布局数据对象GridData。GridLayout的强大功能在于,可以使用GridData为每一个控件设置不同的布局。
import org.eclipse.swt.SWT;
public class GridLayoutSample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display, SWT.SHELL_TRIM);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3; //设置网格的列数
gridLayout.makeColumnsEqualWidth = //设置网格等宽
gridLayout.verticalSpacing = 10;
gridLayout.horizontalSpacing = 10;
shell.setLayout(gridLayout);
new Button(shell, SWT.PUSH).setText("B1");
new Button(shell, SWT.PUSH).setText("Wide Button 2");
new Button(shell, SWT.PUSH).setText("Button 3");
new Button(shell, SWT.PUSH).setText("B4");
new Button(shell, SWT.PUSH).setText("Button 5");
new Button(shell, SWT.PUSH).setText("B6");
//GridData
Button button = new Button(shell, SWT.PUSH);
button.setText("GridData");
button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.GRAB_HORIZONTAL));
Button b1 = new Button(shell, SWT.PUSH);
b1.setText("GridData2");
GridData gridData = new GridData();
gridData.horizontalIndent = 20; // 缩进
gridData.horizontalSpan =2; // 水平跨越两个单元格
gridData.horizontalAlignment = SWT.FILL; //充满
b1.setLayoutData(gridData);
Button b2 = new Button(shell, SWT.PUSH);
b2.setText("GridData3");
GridData gridData2 = new GridData();
gridData2.horizontalSpan =2; // 水平跨越两个单元格
gridData2.verticalSpan = 2;
// 垂直跨越两个单元格
gridData2.horizontalAlignment = SWT.FILL; //水平充满
gridData2.verticalAlignment = SWT.FILL;
//垂直充满
gridData2.grabExcessHorizontalSpace = //设置水平抢占
gridData2.grabExcessVerticalSpace = //设置垂直抢占
gridData2.minimumHeight=100; //最小高度
gridData2.minimumWidth =100; //最小宽度
gridData2.widthHint=100; //设置宽度
gridData2.heightHint=100; //设置高度
b2.setLayoutData(gridData2);
shell.layout();
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
display.dispose();
注意:不要重用GridData对象。每一个面板(Composite)对象中被GridLayout管理的控件必须有一个唯一的GridData对象。如果在设置布局时一个GridLayout中的控件的GridData为null,就会为它创建一个唯一的GridData对象。
注意:设置了widthHint和heightHint属性后只是在程序刚一运行时才会起作用,随着窗口的改变,会重新计算控件大小。
显示效果:
去掉下面两行后的效果:
gridData2.grabExcessHorizontalSpace = //设置水平抢占
gridData2.grabExcessVerticalSpace = //设置垂直抢占按钮“GridData3”未随着窗口大小调整高度。
样式常量对照表
样式常量 &==& 对应属性值
GRAB_HORIZONTAL &==& grabExcessHorizontalSpace=true
GRAB_VERTICAL &==& grabExcellVerticalSpace=true
HORIZONTAL_ALIGN_BEGINNING
&==& horizontalAlignment=SWT.BEGINNING
HORIZONTAL_ALIGN_CENTER &==& horizontalAlignment=SWT.CENTER
HORIZONTAL_ALIGN_END &==& horizontalAlignment=SWT.END
HORIZONTAL_ALIGN_FILL &==& horizontalAlignment=SWT.FILL
VERTICAL_ALIGN_BEGINNING
&==& verticalAlignment=SWT.BEGINNING
VERTICAL_ALIGN_CENTER &==& verticalAlignment=SWT.CENTER
VERTICAL_ALIGN_END &==& verticalAlignment=SWT.END
VERTICAL_ALIGN_FILL &==& verticalAlignment=SWT.FILL
FILL_BOTH &==& horizontalAlignment=SWT.FILL + verticalAlignment=SWT.FILL
7.5 FormLayout(表格式布局)
FormLayout通过设置FormData四边的附加值(FormAttachment对象)来设置控件的布局。一个附加值让一个控件指定的一边附件到父面板容器类(Composite)的位置或者其他控件上。所以,这种布局可以指定某两个控件的相对位置,并且能随着窗口的改变而改变。
FormAttachment 的使用说明及示例参考:
7.6 StackLayout(堆栈式布局)
StackLayout堆栈式布局类似于选项卡(TabFolder),当前只显示最上方的控件。例如,面板上有10个文本框,面板设置为StackLayout布局,当单击“显示下一个文本框”按钮时,下一个文本框就显示出来,这样面板中始终只有一个文本框,设置最上方显示控件的属性是layout.topControl。
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackL
import org.eclipse.swt.layout.GridD
import org.eclipse.swt.layout.GridL
import org.eclipse.swt.widgets.B
import org.eclipse.
import org.eclipse.swt.widgets.D
import org.eclipse.swt.widgets.E
import org.eclipse.swt.widgets.L
import org.eclipse.swt.widgets.S
import org.eclipse.swt.widgets.T
public class testStackLayout {
* @param args
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
// 创建放置文本框的面板
final Composite parent = new Composite(shell, SWT.NONE);
// 设置面板的布局数据
parent.setLayoutData(new GridData(GridData.FILL_BOTH));
// 创建堆栈式布局
final StackLayout layout = new StackLayout();
// 将堆栈式布局应用于模板
parent.setLayout(layout);
// 创建10个文本框
final Text[] textArray = new Text[10];
for (int i = 0; i & textArray. i++) {
textArray[i] = new Text(parent, SWT.MULTI);
textArray[i].setText("这是第 " + i + " 个文本框");
// 设置堆栈中当前显示的控件
layout.topControl = textArray[0];
Button b = new Button(shell, SWT.PUSH);
b.setText("显示下一个文本框");
// 保存当前显示的文本框的索引值
final int[] index = new int[1];
// 为按钮添加单击事件
b.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event arg0) {
// 计算出下一个文本框的索引数
index[0] = (index[0] + 1) % textArray.
// 设置当前显示的控件
layout.topControl = textArray[index[0]];
// 重新刷新布局
parent.layout();
shell.setSize(200, 150);
shell.open();
shell.layout();
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
display.dispose();
显示效果: 点击按钮后:7.7 自定义布局管理器
任何布局类都是Lyaout的子类,Layout是一个抽象类,如下:
package org.eclipse.swt.
import org.eclipse.swt.graphics.*;
public abstract class Layout {
protected abstract Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache);
protected boolean flushCache (Control control) {
protected abstract void layout (Composite composite, boolean flushCache);
创建一个自定义的布局类要继承Layout类,并且要实现Layout中的抽象方法。以下创建的是一个最简单的自定义类MyLayout:package ;
import org.eclipse.swt.graphics.P
import org.eclipse.
import org.eclipse.swt.widgets.L
public class MyLayout extends Layout {
// 该方法计算面板显示的大小
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
return new Point(wHint, hHint);
// 设置子控件的位置
protected void layout(Composite composite, boolean flushCache) {
Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache)方法:该方法是计算布局的大小,也就是按照一定的规则计算出最终布局的长和宽,其中wHint和hHint是设置默认的宽和高。例如:当计算出来的长和宽小于默认的宽和高时,就可以使用默认的宽和高。flushCache参数设置是否使用缓存的数据。
void layout(Composite composite, boolean flushCache)方法:该方法是对该面板(参数Composite)中所有的控件(Control)设置显示的具体位置,通常获得该面板中的所有控件的方法是composite.getChildren()。这样就可以根据指定的计算规则来放置每个控件的位置了。
综上所述,创建一个自定义布局关键是实现这两个方法,而具体布局的设置要根据设定的计算方法来实现。
布局计算的常用方法
1. 控件(Control)类中的常用方法
◆ 计算控件合适的大小的方法:Point computeSize(int wHint, int hHint)和Point computeSize(int wHint, int hHint, boolean changed)。例如:
Point point = puteSize(SWT.DEFAULT, SWT.DEFAULT);
int width = point.x;
int height = point.y;
◆ 获得控件当前坐标位置的方法:Rectangle getBounds()。例如:
Rectangle rect = control.getBounds();
int left = rect.x;
int right = rect.
int top = rect.y;
int bottom = rect.
◆ 设置控件位置的方法:setBounds(int x, int y, int width, int height)或setBounds(Rectangle rect)。
2. 面板(Composite)类中的常用方法
◆ 获得面板的大小区域的方法:Rectangle getClientArea()。
◆ 获得所有子控件的方法:Control[] getChildren()。
◆ 获得面板的布局对象:Layout getLayout()。
自定义布局类(BorderLayout)
BorderLayout布局将控件按东、南、西、北、中5个区域放置,每个方向最多只能放置一个控件,随着窗口大小的改变,整个窗口会不断撑大。
(1)创建一个BorderData类,该类设置控件所在位置。package ;
import org.eclipse.swt.SWT;
public final class BorderData {
public int region = SWT.CENTER; // 默认为中间
public BorderData() {
public BorderData(int region) {
this.region =
(2)编写最重要的BorderLayout类,该类的详细代码如下:package ;
import org.eclipse.swt.SWT;
public class BorderLayout extends Layout {
// 定义存放在不同位置的5个控件
protected Point computeSize(Composite composite, int wHint, int hHint,
boolean flushCache) {
getControls(composite);
// 定义面板的宽和高
int width = 0, height = 0;
// 计算面板的宽度
width += west == null ? 0 : getSize(west, flushCache).x;
width += east == null ? 0 : getSize(east, flushCache).x;
width += center == null ? 0 : getSize(center, flushCache).x;
// 如果上部和下部都有控件,则宽取较大值
if (north != null) {
Point pt = getSize(north, flushCache);
width = Math.max(width, pt.x);
if (south != null) {
Point pt = getSize(south, flushCache);
width = Math.max(width, pt.x);
// 计算面板的高度
height += north == null ? 0 : getSize(north, flushCache).y;
height += south == null ? 0 : getSize(south, flushCache).y;
int heightOther = center == null ? 0 : getSize(center, flushCache).y;
if (west != null) {
Point pt = getSize(west, flushCache);
heightOther = Math.max(heightOther, pt.y);
if (east != null) {
Point pt = getSize(east, flushCache);
heightOther = Math.max(heightOther, pt.y);
height += heightO
// 计算的宽和高与默认的宽和高作比较,返回之中较大的
return new Point(Math.max(width, wHint), Math.max(height, hHint));
protected void layout(Composite composite, boolean flushCache) {
getControls(composite);
// 获得当前面板可显示的区域
Rectangle rect = composite.getClientArea();
int left = rect.x, right = rect.width, top = rect.y, bottom = rect.
// 将各个控件放置到面板中
if (north != null) {
Point pt = getSize(north, flushCache);
north.setBounds(left, top, rect.width, pt.y);
top += pt.y;
if (south != null) {
Point pt = getSize(south, flushCache);
south.setBounds(left, rect.height - pt.y, rect.width, pt.y);
bottom -= pt.y;
if (east != null) {
Point pt = getSize(east, flushCache);
east.setBounds(rect.width - pt.x, top, pt.x, (bottom - top));
right -= pt.x;
if (west != null) {
Point pt = getSize(west, flushCache);
west.setBounds(left, top, pt.x, (bottom - top));
left += pt.x;
if (center != null) {
center.setBounds(left, top, (right - left), (bottom - top));
// 计算某一控件当前的大小,长和宽
protected Point getSize(Control control, boolean flushCache) {
puteSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
// 设置该类中每个位置控件的属性的方法
protected void getControls(Composite composite) {
// 获得当前面板中所有的控件对象
Control[] children = composite.getChildren();
// 循环所有控件,并将每个控件所放的位置对号入座
for (int i = 0; i & children. i++) {
Control child = children[i];
BorderData borderData = (BorderData) child.getLayoutData();
if (borderData.region == SWT.TOP) {
} else if (borderData.region == SWT.BOTTOM) {
} else if (borderData.region == SWT.RIGHT) {
} else if (borderData.region == SWT.LEFT) {
}(3)最后创建一个测试类:package ;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.B
import org.eclipse.swt.widgets.D
import org.eclipse.swt.widgets.S
import org.eclipse.swt.widgets.T
public class TestBorderLayout {
* @param args
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(200, 150);
shell.setLayout(new BorderLayout());
Button buttonWest = new Button(shell, SWT.PUSH);
buttonWest.setText("左");
buttonWest.setLayoutData(new BorderData(SWT.LEFT));
Button buttonEast = new Button(shell, SWT.PUSH);
buttonEast.setText("右");
buttonEast.setLayoutData(new BorderData(SWT.RIGHT));
Button buttonNorth = new Button(shell, SWT.PUSH);
buttonNorth.setText("上");
buttonNorth.setLayoutData(new BorderData(SWT.TOP));
Button buttonSouth = new Button(shell, SWT.PUSH);
buttonSouth.setText("下");
buttonSouth.setLayoutData(new BorderData(SWT.BOTTOM));
Text text = new Text(shell, SWT.MULTI);
text.setText("中间");
text.setLayoutData(new BorderData());
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
display.dispose();
显示效果: 拖放后的效果:
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 java swt text的监听 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信