您的位置:首页 > 编程语言 > Java开发

[转载]RCP开发中实用的Eclipse系统类

2016-06-16 14:25 337 查看

引言

RCP(Rich Client Platform),即富客户端平台,是 Eclipse 提供给开发者的强大的开放性开发平台,允许开发基于 Eclipse 的应用程序,风格将与 Eclipse 相同。由于是基于 Eclipse,因此 Eclipse 中许多有用的系统类,就可以在开发者自己的 RCP 应用中利用起来,这样不仅减少了开发量,也大大提高了系统稳定性。本文介绍了一些笔者在实际开发中用到的 Eclipse 系统类,详细的认识它们可以为你的 RCP 开发提供捷径。

实用类简介

SafeRunner 的用法

BusyIndicator 的用法

PreferencesUtil 的用法

IDialogSettings 的用法

FileLocator 的用法

WorkbenchHelp 的用法

MessageDialogWithToggle 的用法

视图 ViewPart 中的 IMemento

重新认识 Display 类

SafeRunner 的用法

Eclipse 提供了一个类,名为 SafeRunner,允许开发者将异常代码放入 SafeRunner 的 run 方法中执行,SafeRunner 默认对异常代码添加 try … catch 语句,捕捉异常并且将异常信息记录日志,同时 SafeRunner 也允许开发者对异常进行其他处理。

System.out.println("语句 1");
SafeRunner.run(new ISafeRunnable() {
@Override
public void run() throws Exception {
// 异常代码的执行位置
System.out.println("语句 2(可能抛出异常)");
throw new RuntimeException("语句 2 的异常");
}
@Override
public void handleException(Throwable exception) {
// 对异常进行其他处理
exception.printStackTrace();
}
});
System.out.println("语句 3");


在 handleException 方法中可以对异常进行其他的处理,比如打印异常信息、记录到数据库等等。

BusyIndicator 的用法

当试图在执行一个线程任务的同时,主线程停止等待,直到任务执行完毕,这个需求开发者一般会想到使用 Display 的 sync 方法,将任务放入主线程执行,这样执行的缺点是,任务执行时主线程停止响应,给人程序已死的感觉。因此为了解决这个缺点,就可以使用 BusyIndicator 执行任务,它使得任务执行时鼠标显漏斗状,标识主线程忙碌,实际任务在另一线程执行。

public static void handleClick(Button button) {
button.setText("Running...");

BusyIndicator.showWhile(button.getDisplay(),
new SleepThread(5000));

button.setText("BusyIndicator");
}

static class SleepThread extends Thread {
private long ms;

public SleepThread(long ms) {
this.ms = ms;
}

public void run() {
try {
sleep(ms);
} catch (InterruptedException e) {
}
}
}


PreferencesUtil 的用法

Eclipse 提供了首选项扩展点,允许开发者定义自己的首选项集成到 Eclipse 当中(具体的首选项扩展点的扩展方法可以查看 Eclipse 官方开发文档),正常来说,用户可以通过 Eclipse 的 Window->Preferences 菜单打开所有的首选项,然后找到自定义的首选项页。但是如果开发者希望可以通过别的方式打开自定义的首选项页时,就需要利用到 PreferencesUtil,这个类提供了打开指定首选项页的功能

{% highlight java %}

PreferenceDialog createPreferenceDialogOn =

PreferencesUtil.createPreferenceDialogOn(null, “testPreferencesUtilPage”, null, null);

createPreferenceDialogOn.open();

{% endhighlight %}

IDialogSettings 的用法

IDialogSettings 是一个为对话框设置提供持久化功能的一个接口,该接口提供了键值对的存储机制,键必须是字符串,值则可以是字符串或者字符串数组(IDialogSettings 提供的方法允许值是非字符串类型,但是 IDialogSettings 的实现会将其他非字符串类型的基本类型转换为字符串类型,然后保存)。开发者希望在对话框关闭时候保存状态,打开对话框恢复状态时,就可以利用 IDialogSettings 接口了。附件程序使用 InputDialog,将用户输入的内容保存到 IDialogSettings 实例中,使用 IDialogSettings 的 save 方法将 IDialogSettings 中的信息保存到本地文件,在第二次打开 InputDialog 时,又使用 IDialogSettings 的 load 方法加载设置。

private static IDialogSettings ds = new DialogSettings("myds");
public static void handleClick() {
String fileName = "c:/save.xml";
if (new File(fileName).exists())
{
try {
ds.load(fileName);
} catch (IOException e1) {
e1.printStackTrace();
}
}
InputDialog id = new InputDialog(null, "IDialogSettings Title",
"IDialogSettings Message", ds.get("iduc") == null ? "" : ds.get("iduc"), null);
if (id.open() == Window.OK)
{
ds.put("iduc", id.getValue());
}
try {
ds.save(fileName);
} catch (IOException e) {
e.printStackTrace();
}
}


在 InputDialog 中输入 helloworld, 点击 OK,打开清单 5 中保存的文件 c:/save.xml,它的内容如清单 6 所示。可以看出 IDialogSettings 中的信息通过调用 save 方法,保存成了一个 XML 文件格式。

<?xml version="1.0" encoding="UTF-8"?>
<section name="myds">
<item value="helloworld" key="idu
4000
c"/>
</section>


FileLocator 的用法

在 Eclipse 中编辑项目时,往往会根据需要在项目中新建一些文件,如 properties 文件等等,当我们需要在 RCP 运行时找到这些文件时,就需要利用 FileLocator 类。

URL location = FileLocator.find(Platform
.getBundle("eclipse_system_class"), new Path(
"fileLocator.properties"), null);
PropertyResourceBundle bundle = null;
InputStream is = null;
String aboutText = "";
if (location != null) {
try {
is = location.openStream();
bundle = new PropertyResourceBundle(is);
} catch (IOException e) {
bundle = null;
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
}
}
}

if (bundle != null) {
try {
// 值
aboutText = bundle.getString("filelocator");
MessageDialog.openInformation(null, "FileLocator", aboutText);
} catch (MissingResourceException e) {
}
}


WorkbenchHelp 的用法

在了解 WorkbenchHelp 之前,读者需要了解 Eclipse 中的帮助扩张点,这个扩张点的目的是为开发者提供自定义帮助内容的方法,该扩展点的具体使用方法可以查看 Eclipse 官方开发文档。WorkbenchHelp 类提供了快捷的 API,用以设置、显示、获得帮助扩展点的帮助。

public void createPartControl(Composite parent)
{
Composite com = new Composite(parent, SWT.NONE);
...
WorkbenchHelp.setHelp(com, "eclipse_system_class.contexthelp");
}


MessageDialogWithToggle 的用法

MessageDialogWithToggle 是一个带有 CheckBox 的提示对话框,MessageDialogWithToggle 不仅保存了用户点击的按钮信息,还保存了用户是否选中了 ChekBox。

MessageDialogWithToggle dialogWithToggle = new MessageDialogWithToggle(null,
"MessageDialogWithToggle Title", null, "MessageDialogWithToggle Message",
MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL,
IDialogConstants.NO_LABEL}, 0, "是否选中 toggle?", false);
if (dialogWithToggle.open() == IDialogConstants.YES_ID)
{
boolean toggleState = dialogWithToggle.getToggleState();
MessageDialog.openInformation(null,
"MessageDialogWithToggle", "是否选中 toggle " + toggleState);
}


视图 ViewPart 中的 IMemento

Eclipse 的工作台 Workbench 被关闭的时候,会执行每个视图 (ViewPart) 的 saveState 方法,一个 IMemento 对象就会传入到 saveState 方法中,在 IMemento 对象中可以存储整型、字符串型、浮点型等数据,我们就可以将一些状态信息等存储到 IMemento 中,平台会将这些数据存储到 org.eclipse.ui metadata 目录下的 workbench.xml 文件中。下次打开视图时,平台还会从 workbench.xml 重新读取 IMemento 对象,并且传入视图的 init 方法。那么 init 方法就可以恢复上一次关闭前的状态了。

public void init(IViewSite site, IMemento memento) throws PartInitException
{
super.init(site, memento);
if (memento != null){
String initData = memento.getString("initdata");
// 每一次打开都会获得这个 initData.
}
}

public void saveState(IMemento memento)
{
// 改变状态的话,就在关闭的时候存储到 IMemento 中
if (memento != null){

memento.putString("initdata", "IMemento init");
}
}


重新认识 Display 类

//addFilter方法用于添加全局监听器,任何在 RCP 应用中发生的同类事件都会触发 addFilter 的监听器。
display.addFilter(SWT.MouseDown, new Listener() {
@Override
public void handleEvent(Event e)
{
System.out.println("filter mouse  down");
}
});

//调用 findWidget 方法,快速获得控件
Button displayBtn = … ;
Control d = (Control)display.findWidget(displayBtn.handle);
System.out.println(d == displayBtn);

//Display 的 timerExec方法用于在指定毫秒数结束以后执行一段代码,为 RCP 程序提供定时执行的功能
display.timerExec(5000, new Runnable() {
@Override
public void run()
{
System.out.println("timerExec");
}
});
//Display 的 disposeExec方法是程序退出时候的钩子,在 Display 被销毁的时候触发执行,通过这个方法允许你在程序退出时做一些收尾工作
display.disposeExec(new Runnable(){

@Override
public void run()
{
System.out.println("disposeExec");
}

});


声明

本文转载之http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-rcpclass/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  eclipse