170 likes | 316 Views
信威核心网网管培训 SWT-JFace. 主讲:胡俊 部门:核心网支撑技术部 项目组: MMI. SWT-JFace. SWT-JFace 概览 SWT-JFace 是什么 形成的理由 区别与 Swing 许可证与支持平台 小结. SWT-JFace. SWT-JFace 形成的理由. SWT-JFace. SWT-JFace 区别 Swing. SWT-JFace. SWT-JFace 支持平台 Windows Windows CE (ARM PocketPC) Windows CE (ARM PocketPC, J2ME profile)
E N D
信威核心网网管培训SWT-JFace 主讲:胡俊 部门:核心网支撑技术部 项目组:MMI
SWT-JFace • SWT-JFace概览 • SWT-JFace是什么 • 形成的理由 • 区别与Swing • 许可证与支持平台 • 小结
SWT-JFace • SWT-JFace形成的理由
SWT-JFace • SWT-JFace区别Swing
SWT-JFace • SWT-JFace支持平台 Windows Windows CE (ARM PocketPC) Windows CE (ARM PocketPC, J2ME profile) Linux (x86/GTK 2) Linux (x86_64/GTK 2) Linux (PPC/GTK 2) Linux (x86/Motif) Solaris 8 (SPARC/GTK 2) Solaris 8 (SPARC/Motif) QNX (x86/Photon) AIX (PPC/Motif) HP-UX (HP9000/Motif) Mac OSX (Mac/Carbon)
SWT-JFace • 小结 • 让我们感谢IBM吧 • 争论SWT-JFace/Swing是没有意义的
SWT-JFace • SWT-JFace编程起步 • SWT的重要类Display,Shell • 一个SWT sample • JFace的重要类ApplicationWindow • 一个SWT/JFace sample
SWT-JFace import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; public class HelloSWT { public static void main (String [] args) { Display display = new Display(); Shell shell = new Shell(display); Text helloText = new Text(shell, SWT.CENTER); helloText.setText("Hello SWT!"); helloText.pack(); shell.pack(); shell.open(); while (!shell.isDisposed()){ if (!display.readAndDispatch()) display.sleep();} display.dispose();}}
SWT-JFace • Display • Display类并不是可见的,它负责监管着GUI的资源并管理着和操作系统的通信。也即意味着它不光要关注着它自己的窗口是如何显示、移动和重画的,还同时要确保诸如鼠标点击、键盘敲击等事件送达小部件并去处理它们。 • Display类的主要任务就是负责将你的代码SWT和JFace命令翻译成底层的命令来调取操作系统。这一过程f分两部分组成,并随着Display类的实例的产生而开始。首先,Display对象构建一个代表着操作系统平台的OS类的实例。这个类通过一系列被称之为原生方法的特殊Java处理过程提供了接触计算机底层资源的途径。然后像调度员一样工作。 • 有两个在任何基于SWT的GUI中必须用到的方法,第一个是Display(),它产生一个类的实例并将其和GUI相联系;第二个是getCurrent(),它返回一个应用程序的主线程,用户界面线程。第二个方法通常通常是以dispose()方法来终结Display的操作。
SWT-JFace • Shell • Display类提供了窗口管理一样,Shell类扮演着GUI主窗口的角色 • 每一个SWT/JFace应用程序都是基于其主Shell对象上的小部件的,但是在应用程序中可能还存在着其他的Shell对象,它们通常是和一些临时窗口或是对话框相联系的。这些Shell并不附着于Display实例,因而被看作是从属性的Shell。附着于Display的shell被成为顶层shell。Shell有着大量的属性,这些属性可以允许用户修改状态值或是读取信息。这样的特性形成了组件的风格。你也可以通过向Shell的构造器加入第二个参数来控制Shell的风格。Shell接受了一个顶层窗口的默认风格,称为“SHELL_TRIM”。标题栏(SWT.TITLE)和用户可以最小化SWT.MIN)、最大化(SWT.MAX)、改变尺寸(SWT.RESIZE)和关闭(SWT.CLOSE)shell。至于其他的shell的默认风格,DIALOG_TRIM则确保着对话框的shell有一个标题栏、一个活动区的边界(SWT.BORDER)和被关闭的能力。在你的GUI之内,你可以设定shell或其他小部件的风格参数值,若是多个值则可以用“|”相连。除了提到的属性,你还可以确定shell的形态,以限定用户修改shell的状态。有一个形态对话框会将除对话框以外的动作全部阻断以获取用户的关注。它不能被移动或是改变尺寸,只可以使用给予的按钮关闭或是取消。
SWT-JFace • ApplicationWindow类中的设置方法 • ApplicationWindow方法功能 • addMenuBar() Configures the window with a top-level menu • addToolBar() Adds a toolbar beneath the main menu • addStatusLine() Creates a status area at the bottom of the window • setStatus(String) Displays a message in the status area • getSeparator() Returns the line separating the menu from the window • setDefaultImage(Image) Displays an image when the application has no shell • setExceptionHandler(IExceptionHandler) • Configures the application to handle exceptions according to the specified interface
SWT-JFace • JFace • Eclipse文档中使用了两个术语来指代和SWT小部件协同的JFace类:助手类和基于模型的适配器。 • 这些适配器可以被分为四大类 • 适配器分类 功能 • 阅读器 :分离小部件的外观和信息 • 动作和实施 :简化和组织事件处理进程 • 图案和字体注册: 管理和分配/释放图案、字体资源 • 对话框和向导: 扩展SWT对话框和用户互动的能力
SWT-JFace • import org.eclipse.jface.window.*; • import org.eclipse.swt.*; • import org.eclipse.swt.widgets.*; • public class HelloSWT_JFace extends ApplicationWindow { • public HelloSWT_JFace() {super(null);} • protected Control createContents(Composite parent) { • Text helloText = new Text(parent, SWT.CENTER); • helloText.setText("Hello SWT and JFace!"); • parent.pack(); • return parent;} • public static void main(String[] args) { • HelloSWT_JFace awin = new HelloSWT_JFace(); • awin.setBlockOnOpen(true); • awin.open(); • Display.getCurrent().dispose();}}
使用一个表格布局管理来放置control 生成一个文本区域和两个按钮。文本区域定位合成器的左上部。两个按钮位于文本control的下方,并且Ok按钮苦放置于Cancel按钮的左侧。 package com.swtjface.Ch6; import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.layout.*; public class Ch6FormLayoutComposite extends Composite { public Ch6FormLayoutComposite(Composite parent) { super(parent, SWT.NONE); FormLayout layout = new FormLayout(); setLayout(layout); Text t = new Text(this, SWT.MULTI); FormData data = new FormData(); data.top = new FormAttachment(0, 0); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100); data.bottom = new FormAttachment(75); t.setLayoutData(data); Button ok = new Button(this, SWT.NONE); ok.setText("Ok"); Button cancel = new Button(this, SWT.NONE); cancel.setText("Cancel"); data = new FormData(); data.top = new FormAttachment(t); data.right = new FormAttachment(cancel); ok.setLayoutData(data); data = new FormData(); data.top = new FormAttachment(t); data.right = new FormAttachment(100); cancel.setLayoutData(data); }} 在此,我们定位了文本小部件,它是主要的control,其他的都以此来作现对定位。通过设定顶部和左侧域的FormAttachments为百分比0,我们锚定了文本小部件在左上角。右侧域是100,所以文本小部件在(合成器)的水平方向空间全部充满;而且底部域的值为75,这导致其在垂直方向占据了四分之三的空间。 Ok按钮必须遵循两条规则:它必须总是立即处于文本区域下方并且立即处于Cancel按钮的左侧。我们使用顶部和右侧的FormData来设定这一切,即给予每一个FormAttachment实例以一个恰当的control作为一个参照。在将Cancel按钮定位于文本区域下方之后,我们利用一个百分之一百的FormAttachment强制其处于合成器的右侧。无论你怎样重定窗口大小尺寸,按钮和文本其余总能维持它们正确的位置。你或许可能注意到:虽然我们在为Ok按钮设定数据时 data.left = new FormAttachment(ok);使用了行:data.right = new FormAttachment(cancel); 但是却没有为Cancel按钮作任何相应的声明。因为第二行潜在地应用了前者,SWT禁止你生成循环的attachment。无论何时你有一个名为foo的control用bar这个control来参照,则bar决不可以再返过来使用foo来参照。根据SWT的文档,如果你有这样子的attachment,则结果布局运算法则将无法定义,虽然SWT也保证过徽终止程序避免你的程序陷于一个无穷的循环之中。
用JFace管理图案 就象JFace的FontRegistry类简化了字体管理那样,ImageRegistry类可以让你集成多个图案于一个应用程序内而无需为资源回收而劳神。它使用了和FontRegistry类相同的处理机制。要将一个图案放入注册表,你需要使用带有一个Image对象和一个字符串的put()方法。当图案需要被显示时,get()方法会基于注册键返回该图案。这儿是使用elipse_lg.gif文件的一段样例: ImageRegistry ir = new ImageRegistry(); ir.put("Eclipse", new Image(display, "eclipse_lg.gif")); Image eclipse = ir.get("Eclipse"); 在这个案例中,你仍需要为Image对象分配资源。这在如果是应用程序注册了大量的图案而仅显示一小部分时会产生问题。因为这个原因,JFace使用了ImageDescriptor类。就像SWT的ImageData类,ImageDescriptor包含了需要一个图案的信息,而不需要作系统资源分配。帮定于ImageRegistry类的方法get()和put()也可适用于ImageDescriptor对象,就象下面的代码显示的那样: ImageRegistry ir = new ImageRegistry(); ImageDescriptor id = createFromFile(getClass(),"eclipse_lg.gif"); ir.put("Eclipse", id); Image eclipse = ir.get("Eclipse"); 如果你使用ImageDescriptor,put()和get()方法的操作可无需为Image对象分配资源。这样,你可以向应用程序的ImageRegistry加入大量的ImagDescriptor而无需担心会生成图案(耗用资源)。最终,由于当Display对象被关闭时,一个ImageRegistry会丢弃其内容,你就不必担心图案资源的回收了。