Eclipse RCP SWT
阅读数:155 评论数:0
跳转到新版页面分类
python/Java
正文
SWT全称是Standard Widget Toolkit。
Display和Shell
Display和Shell类是SWT应用的主要组件,org.eclipse.swt.widgets.Shell类表示一个窗口,org.eclipse.swt.widgets.Display负责SWT与操作系统通信,它将SWT/JFace的各种调用转化为系统的底层调用,控制操作系统为SWT分配资源。
每个SWT应用需要至少一个Display和一到多个Shell实例,主Shell使用一个Display作为构造函数参数。
编写SWT程序的一般步骤:
(1)创建一个Display对象。
(2)创建一个或者多个Shell对象,可以认为Shell代表了程序的窗口。
(3)在Shell内创建各种组件(widget)
(4)各组件进行初始化(外观、状态等),同时为各种组件的事件创建监听器(listener)
(5)调用Shell对象的open()方法显示窗体
(6)对事件进行监听并处理
(7)调用Display对象的dispose()方法结束程序。
Event loop
SWT不提供自己的event loop,编程者需要自己检查event loop来更新用户接口。在loop中执行readAndDispatch()方法,用于从本地操作系统事件队列中获取事件并分发给SWT事件系统,loop会一直执行,直到shell被关闭。
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
// run the event loop as long as the window is open
while (!shell.isDisposed()) {
// read the next OS event queue and transfer it to a SWT event
if (!display.readAndDispatch())
{
// if there are currently no other OS event to process
// sleep until the next OS event is available
display.sleep();
}
}
// disposes all associated windows and their components
display.dispose();
如果在Eclipse 插件或Eclipse RCP应用中使用SWT,Eclipse framework会提供event loop。
和JFace的关系
JFace是基于SWT的一组API,用于提供高级的抽象API和常用的函数。
在插件中使用SWT
SWT库是作为一个Eclipse 插件在使用,如果你创建一个Eclipse 插件,并想使用SWT,需要在manifest文件指定依赖org.eclipse.swt。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: My SWT-based Plug-in
Bundle-SymbolicName: de.vogella.swt
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.swt
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
SWT库中可用的组件
SWT组件位于org.eclipse.swt.widgets和org.eclipse.swt.custom包中,组件扩展于Widget或Control类。
SWT会尽量使用native widgets,所以有一些组件会扩展native platform的能力,它们也是org.eclipse.swt.custom包中的一部分,一般使用前缀C,例如CCombo,相比于Combo类,CCombo类可以设置组件的高度。
org.eclipse.swt.custom包中的组件使用纯Java实现的,org.eclipse.swt.wdigets包中的组件使用native code。
如果一个新的组件需要包含其它的组件,它应该扩展于Composite,否则需要扩展Canvas。
内存管理
SWT组件不会自动进行垃圾回收,如果你释放一个组件,你需要调用它的dispose方法,幸运的是,如果一个container disposed,它所有的孩子也会被释放。
自动释放操作不适用于Color、Cursor、Display、Font、GC、Image、Printer、Region、Widget和其子类,JFace可以通过LocalResourceManager简化这个过程。
创建组件
SWT组件,除了Shell,都 是通过包含它的父组件进行创建,构造函数的第二个参数是样式位,它们定义 在SWT类中,如果没有指定,使用SWT.NONE。
例如创建一个push button
new Button(shell, SWT.PUSH);
创建一个checkbox button
new Button(shell, SWT.CHECK);
基本的容器
Composite类可以包含其它的widgets,Group类也是一个容器,它所包含的组件外部会有边框,同时允许你设置header和对组件分组。
Event Listener
你可以在SWT controls上注册事件监听器,例如在Text组件上使用ModifyListener监听修改,在Button组件上使用SelectionLister监听点击事件。
Button button =
new Button(shell, SWT.PUSH);
//register listener for the selection event
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
System.out.println("Called!");
}
});
NameAdapter对应NameListener,因为一个listener接口有时会包含多个方法,如果你想实现其中的一部分,可以使用对应的adapter,adapter预实现了listener中的所有方法。
如果你想对应用添加监听器,可以使用Display类.
SWT中的布局管理器
1、常用布局管理器
(1)AbsoluteLayout
允许你指定准确的位置、宽度和高度,如果用户接口需要基于screen大小改变,尽量不要使用这个管理器。
(2)FillLayout
在一行(SWT.HORIZONTAL)或一列(SWT.VERTICAL)中排列大小相同的组件。
也可以使用spacing属性来设置组件间的空间,组件的margins可以通过marginWidth和marginHeight属性来指定。
(3)RowLayout
把组件放在多行(SWT.HORIZONTAL)或多列(SWT.VERTICAL)中,允许调整布局参数。
可以通过RowData元素来设置每个元素的高和宽。
(4)GridLayout
在网格中排列组件。
new GridData(horizontalAlignment,
verticalAlignment,
grabExcessHorizontalSpace,
grabExcessVerticalSpace,
horizontalSpan,
verticalSpan)
horizontalAlignment:定义在cell中水平如何放置(SWT.LEFT,SWT.CENTER,SWT.RIGHT,或者SWT.FILL)
verticalAlignment:定义在cell中垂直如何放置(SWT.TOP,SWT.CENTER,SWT.END,SWT.BOTTOM或者SWT.FILL)
grabExcessHorizontalSpace:定义是否使用所有水平剩余的空间。
grabExcessVerticalSpace:定义是否使用所有垂直剩余的空间。
horizontalSpan:control占用的cell的水平方向个数
verticalSpan:control占用的cell的垂直方向个数
heightHint:优选的像素高度
widthHint:优选的像素宽度
GridDataFactory
GridDataFactory用于创建GridData,
// listBox is an SWT widget
// GridDataFactory version
GridDataFactory.fillDefaults().grab(true, true).hint(150, 150).applyTo(listBox);
// Equivalent SWT version
GridData listBoxData = new GridData(GridData.FILL_BOTH);
listBoxData.widthHint = 150;
listBoxData.heightHint = 150;
listBoxData.minimumWidth = 1;
listBoxData.minimumHeight = 1;
listBox.setLayoutData(listBoxData);
(5)FormLayout
使用关联的附件来排列组件。
2、Layout Data
每个SWT组件可以有一个关联的layout specific settings,例如用于GridLayout的GridData。
button = new Button(parent, SWT.PUSH);
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
button.setLayoutData(gridData);
当容器显示时会自动计算布局,可以主动调用composite.layout()来激活布局计算。
常用组件
(1)颜色对话框ColorDialog
(2)目录对话框DirectoryDialog
(3)文件对话框FileDialog
(4)信息对话框MessageDialog
确定对话框 MessageDialog.openConfirm(),错误对话框 MessageDialog.openError(),信息对话框MessageDialog.openInformation(),提问对话框MessageDialog.openQuestion(),警告对话框MessageDialog.openWarning(),
(5)字体对话框FontDialog
(6)输入对话框InputDialog
(7)打印对话框PrintDialog
(8)进度监视对话框ProgressMonitorDialog