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

 

 

 




相关推荐

Eclipse RCP是Rich Client Platform,即富客户平台,使用者可以使用Java来创建桌面程序,这些应用程序能够得到Eclipse的底层支持。 1、下载</p

运行时,Eclipse 应用的结构是通过一个application model来描述的。这个application model包含了应用中独立的元素和它们的结构关系。 每个mode

每个plug-ins可以通过下面方式作用于application model: (1)static contributions 通过文件,这些扩展称为fragment

1、@javax.inject.Inject 定义在JSR330中 ,可以写在字段、构建函数或方法上,Eclipse 框架试图把相关的对象注入到字段或实例的参数上。

一个Eclipse应用在启动过程时会创建一个实现IEclipseContext接口的对象,这个对象称为Eclipse context。 这个context和Map数据结构类似,但和

1、@PostConstruct 当一个类的构造函数执行,字段和方法都注入后执行。 2、@PreDestroy 类被destroyed前执行,可以用来清

Eclipse application model允许你指定command和handlers。 command和handlers model element的使用是可选的,你可以使

一个Eclipse application的配置包括icons、splash screen和plug-ins。 一个product总是指向一个application class,对

一个feature可以理解为一个逻辑单元,描述了一组plug-in和其它features。它也有name、version number和license information。 f

JFace是基于SWT的一组plug-ins,但是JFace不会隐藏SWT的API。JFace提供了viewers框架,它可以简化数据模型和可视化显示的匹配。 JFace也提供了帮