|
发表于 2005-3-1 13:00:19
|
显示全部楼层
http://addone.blogchina.com/blog/article_17203.774130.html
Eclipse In Action - 附录E. 介绍JFace
2005年 01月31日
《Eclipse In Action》是一本面向Eclipse初学者的教程,对Java开发有兴趣的人也可以读一读。
笔者参与了该书的翻译工作,并同步发布译稿,希望各位指正。
附录E. 介绍JFace
翻译:Addone Squid[天堂鱿鱼](addone@gmail.com)
--------------------------------------------------------------------------------
在本附录中,我们将仔细看看一个由IBM制作的更高级的图形用户界面(GUI)工具包--JFace。我们将讨论它是什么,它的用途,以及它与标准窗口小部件工具包(SWT)之间的交互。
E.1 体系结构
--------------------------------------------------------------------------------
JFace是构建在SWT上的一个平台无关的工具包。它为许多典型的应用程序特性提供了便利的类,并且简化了许多通用的UI任务。它增强了SWT并与其协同工作,并且从不对开发者屏蔽它。
图E.1显示了SWT、JFace和Eclipse之间的关系。如图所示,JFace完全依赖于SWT,但SWT不依赖于任何东西。此外,Eclipse构建在JFace和SWT两者之上,且可按需使用它们。
JFace处理的一些通常的任务包括以下几种:
它提供了观察器(viewer)类以处理对窗口小部件进行集合,归类,过滤和更新这种冗长乏味的工作。
它提供了动作(actions)以便用户可以定义自己的行为并赋给特定的部件,如菜单项,工具栏项,按钮等。Actions被设计为可以在不同的窗口小部件中共享。同样的动作可以被一个菜单项和一个工具栏项使用,而不需要拷贝代码。
它提供了注册表(registries)以放置图片和字体。设计这些注册表是为了提供一种机制以比较简单地照顾有限的系统资源。经常使用的图片和文字应该放到这些注册表中。
它定义了标准对话框(dialogs)和向导(wizards),并且定义了一个用于构建复杂的用户交互界面的框架。一些已经实现了的对话框类型包括消息对话框(MessageDialog)、输入对话框(InputDialog)、首选项对话框(PreferenceDialog)。
JFace的主要目标是让你能够自由的关注你的特定程序的实现,而无需去解决那些大多数图形界面程序共有的问题。
图E.1 JFace和其他Eclipse技术的整合
在你能够编译和运行本附录的示例前,你需要将其他几个JAR文件添加到你的classpath或者Eclipse工程库:
<eclipse-root>\plugins\org.eclipse.jface_2.1.0\jface.jar
<eclipse-root>\plugins\org.eclipse.core.runtime_2.1.0\runtime.jar
<eclipse-root>\plugins\org.eclipse.ui.workbench_2.1.0\workbench.jar
<eclipse-root>\plugins\org.eclipse.core.boot_2.1.0\boot.jar
记住,在你的Java库路径需要有正确的SWT库,就像附录D中的那样。
E.2 构建一个JFace程序
--------------------------------------------------------------------------------
使用JFace来构建程序和构建一个纯SWT程序是不同的。首先,你不需要担心消息泵的实现,而且也不是直接和Display或Shell类打交道。相反的,你只需要从org.eclipse.jface.window.ApplicationWindow继承你的主类。这个类已经内置了对菜单栏、工具栏和一个状态条的完全支持。
在这个示例中,我们将会让你看看,如何构建一个具有一个菜单栏、一个工具栏和一个状态条的简单程序。在我们观看代码之前,我们想先让你看看你即将创建的东西。图E.2显示了最终的示例:图E.2a显示的主窗体上,有一个菜单栏,一个有一个按钮的工具栏,以及一个状态条。图E.2b显示了和按钮所使用的相同的动作,但这次是用在菜单上。
图E.2 使用JFace,很容易创建执行相同动作的按钮和菜单。(a)展示了按钮而(b)展示了菜单。注意,菜单上的图标和按钮上的图标是一样的。
(a) (b)
注意
我们强烈推荐你参阅以下文章。它们讨论了如何从无到有地构建一个基于JFace的独立程序(一个Windows文件管理器的部分克隆):
http://www-106.ibm.com/developer ... /library/os-ecgui1/
http://www-106.ibm.com/developer ... /library/os-ecgui2/
http://www-106.ibm.com/developer ... /library/os-ecgui3/
E2.1 JFaceExample类
首先,让我们来看看构建屏幕的主类(JFaceExample)。代码在一开始导入了本示例所需要的包:
package org.eclipseguide.jface;
import org.eclipse.jface.action.*;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
ExitAction类扩展了动作(action)且提供了一个可以在特定的窗口小部件间共享的通用类:
public class JFaceExample extends ApplicationWindow
{
private ExitAction exitAction;
将null作为父对象传给ApplicationWindow类表明作为顶层窗口创建。如果需要作为子窗体来创建,你就得传一个已有的Shell的实例:
public JFaceExample()
{
super(null);
接着创建ExitAction类的一个实例,将ApplicationWindow类的一个实例作为参数传给它。ExitAction后面会用这个参数来关闭主窗体:
exitAction = new ExitAction(this);
下面的方法是ApplicationWindow类的一部分:
this.addMenuBar();
this.addStatusLine();
this.addToolBar(SWT.FLAT | SWT.WRAP);
}
当调用它们时,它们依次调用createMenuManager(),createStatusLineManager(),以及createToolBarManager()。如果你希望能有一个菜单栏,状态条,或者一个工具栏,那就需要重载这些方法,确保它们返回正确的类型。我们很快就会看到这些方法的实现。
createContents()方法在你创建自己的程序时需要重载,以便创建并放置你的窗口小部件。在这个示例中,你只需要设置程序窗体标题和状态条:
protected Control createContents(Composite parent)
{
getShell().setText("JFace File Explorer");
setStatus("JFace Example v1.0");
return parent;
}
注意,程序窗体是在所有其他窗口小部件创建之后,窗体在屏幕上显示之前调用这个方法的。
程序窗体的大小在initializeBounds()方法中设置:
protected void initializeBounds()
{
getShell().setSize(300, 200);
}
在SWT中创建菜单是个很让人头痛的过程,但幸好JFace让这个过程多少容易了些。要创建一个菜单集,首先必须创建MenuManager的一个实例作为菜单栏。然后,对于每个子菜单,都需要创建MenuManager的实例并添加到菜单栏中。最后需要添加一个扩展了Action类的类:
protected MenuManager createMenuManager()
{
MenuManager menuBar = new MenuManager("");
MenuManager fileMenu = new MenuManager("&File");
MenuManager helpMenu = new MenuManager("&Help");
menuBar.add(fileMenu);
menuBar.add(helpMenu);
fileMenu.add(exitAction);
return menuBar;
}
StatusLineManager类提供了设置状态条文字的方法,可以用来控制显示在状态栏的一个进度条,也可以用来显示错误文字和图片:
protected StatusLineManager createStatusLineManager()
{
StatusLineManager statusLineManager = new StatusLineManager();
statusLineManager.setMessage("Hello, world!");
return statusLineManager;
}
创建一个工具栏只需创建ToolBarManager的一个实例,传入一个样式(style),然后加入任何动作(actions):
protected ToolBarManager createToolBarManager(int style)
{
ToolBarManager toolBarManager = new ToolBarManager(style);
toolBarManager.add(exitAction);
return toolBarManager;
}
注意,允许使用的样式和SWT的工具栏类(Toolbar)一样--影响工具栏方向的(SWT.VERTICAL和SWT.HORIZONTAL)和影响工具栏视觉效果的(SWT.FLAT和SWT.WRAP)。
下面的部分和你在使用SWT时的基本一样。创建主窗体,设置它在用户关闭之前保持运行,打开窗体,最后在open()返回后处理掉(dispose)Display:
public static void main(String[] args)
{
JFaceExample fe = new JFaceExample();
fe.setBlockOnOpen(true);
fe.open();
Display.getCurrent().dispose();
}
}
E2.2 ExitAction类
以上包装了JFaceExample类。现在,我们来看看ExitAction类。首先还是要导入需要的包:
package org.eclipseguide.jface;
import java.net.*;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.ApplicationWindow;
正如我们在本附录开始时所提到的,一个action可以让你定义其激活时的行为,并且可以让其它窗口小部件共享这个行为。这里,你要创建一个action,通过关闭主窗体的方法来开始关闭程序的过程:
public class ExitAction extends Action
{
能够在不同的窗口小部件间共享该行为是很有用的,这让你可以创建单一区域的代码,而不会因为复制代码产生问题。只要尽量注意一些,你将可以创建一些通用的action,并在你的程序中共用。
传入与连接到到该action的窗口小部件相适合的文本:
ApplicationWindow window;
public ExitAction(ApplicationWindow w)
{
window = w;
setText("E&xit@Ctrl+W");
setToolTipText("Exit the application");
如同在附录D中所提到的,在一个字母前的“&”符号表示该字母应该被看作助记符(mnemonic)。(如果该菜单已经打开并拥有键盘焦点,你就可以通过按相应的按键来执行该action。)符号“@”定义了键盘快捷键;这样,按Ctrl+W便直接调用该action。
以下代码设置了与这个action相关联的图片,它将显示在工具栏或菜单上。图片是从一个叫做icons的目录中读取的,该目录必须放置在和本示例的类文件相同的地方。
try
{
setImageDescriptor(
ImageDescriptor.createFromURL(
new URL("file:icons/sample.gif")));
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
}
需要重载Action的Run方法以便执行你想进行的操作,在这里就是要关闭窗体,实际上也就是令程序结束:
public void run()
{
window.close();
}
} |
|