Eclipseの埋め込みRCP(embedded Rich Client Platform)を探る

モバイル・デバイスにはEclipseが必要

この記事ではeRCP(embedded Rich Client Platform)を紹介します。また、eRCPを構成する様々なコンポーネントについて学び、それらをアプリケーションの中でどのように使うかを解説します。

Chris Aniszczyk, Software Engineer, IBM

Chris AniszczykChris AniszczykはIBM Lotusのソフトウェア技術者であり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。オープンソースの信奉者であり、現在はGentoo Linux (http://www.gentoo.org) ディストリビューションに取り組んでいます。またEMFT(Eclipse Modeling Framework Technology)プロジェクトのコミッターでもあります。



Uriel Liu (liukl@tw.ibm.com), Software Engineer, IBM

Uriel LiuUriel Liuは、IBM China Software Development Labのソフトウェア開発者であり、WEDクライアント技術に取り組んでいます。またeRCPプロジェクトのコミッターでもあります。



2006年 3月 21日

背景について

eRCP(embedded Rich Client Platform)は、EclipseのRCP(Rich Client Platform)で実現された進歩を埋め込み空間に反映するための方法として登場しました。

eRCPは、次のようなコンポーネントから構成されています。

  • eSWT(Standard Widget Toolkit): コア・コンポーネントと拡張コンポーネント、そしてモバイル・エクステンション・コンポーネントがあります。
  • eJFace
  • eWorkbench
  • eUpdate

この記事では、こうした各コンポーネントを、必要に応じてコード例を使いながら説明して行きます。


eSWT

eSWT(embedded Standard Widget Toolkit)は、Java™のグラフィックス・ツールキットとして知られているSWT(Standard Widget Toolkit)のサブセットです。eSWTには、ユーザー・インターフェース(UI)の構成ブロックとして一般的に使われる、一連のコントロールやパネル、ウィジェットなどが用意されています。また、元々SWTに含まれていたものに加えて、モバイル・エクステンションという新しいコンポーネントが導入されています。モバイル・エクステンションはIBMとNokia、Motorolaの共同設計による仕様であり、主にPDAやスマートフォンのようなモバイル・デバイスを対象としています。

eSWTの設計は、その「いとこ」であるSWTとはプラットフォーム依存性の面で異なっています。SWTはプラットフォームに依存しない方式を採用しており、オペレーティング・システム間での移植性を高めるために、可能な限りネイティブ・コードを単純にしています。ただし、移植性とパフォーマンスは相反する問題です。そこでeSWTは別の方法、つまりUGL(Universal Graphics Layer)を採用しました。UGLは、ネイティブ・ツールキット実装上では相変わらずJNI(Java Native Interface)を保持しています。しかしUGLは1:1のJNIラッパーとして動作する代わりに、できるだけネイティブ実装に近づこうとしており、JNIを通してコールバックするための情報しか必要としません。eSWTの方法では、使用されるグラフィック・システムにネイティブ・ツールキットが完全依存するため、移植性は犠牲になります。しかしこれによって、パフォーマンスは劇的に改善されるのです。(パフォーマンスはモバイル・デバイスにとって大きな関心事です。)

eSWTには、下記の3つのコンポーネントが含まれています(図1)。

  • コア・コンポーネント
  • 拡張コンポーネント
  • モバイル・エクステンション・コンポーネント
図1.eSWTのUIツールキット・パッケージ
図1.eSWTのUIツールキット・パッケージ

コア・コンポーネントと拡張コンポーネントは、eSWTのサブセットです。新たに開発されたモバイル・エクステンション・コンポーネントは、モバイル・デバイスを対象としています。このようにコンポーネント化されているため、どのコンポーネントをデバイスに含めるべきかを、デバイスの機能や目的に応じて柔軟に決めることができます。コア・コンポーネントは必須であり、基本的なアプリケーションの実行に必要な最低限の機能を含んでいます。拡張コンポーネントとモバイル・エクステンション・コンポーネントはオプションです。

ここから先では、サンプル・アプリケーションを示しながら各コンポーネントを順次説明します。

eSWT Core

eSWT Coreには基本的なUI要素が含まれています(下位レベルのグラフィックス、イベント、基本的なウィジェット・インフラなど)。表1は、eSWT Coreの中のクラスを示しています。

表1.eSWT Coreのorg.eclipseクラス
swt.widgetsswt.graphicsswt.eventsswt.layoutswt.swt
ButtonColorControlEventFormLayoutSWT
CanvasDeviceDisposeEventFormDataSWTException
ComboFontFocusEventFormAttachmentSWTError
CompositeFontDataKeyEvent--
ControlFontMetricsMenuEvent--
DecorationsGCModifyEvent--
DialogImageMouseEvent--
DisplayImageDataPaintEvent--
EventPaletteDataSelectionEvent--
FileDialogPointShellEvent--
ItemRectangleTraverseEvent--
LabelResourceTypedEvent--
LayoutRGBVerifyEvent--
List----
Menu/MenuItem----
MessageBox----
ProgressBar----
Scrollable----
Scrollbar----
Shell----
Slider----
Synchronizer----
Text----
TypedListener----

eSWT Coreの例

まず、完全なeSWTプログラムから始めましょう。このプログラムはウィンドウを作成し、アプリケーションのタイトル・バー上に「HelloWorld from eSWT」を表示します。次に、幾つかのコア・コントロール(テキストやボタン、リスト)を追加します。レイアウトに関しては、FormLayoutとFormDataを使います。また、ボタン上にSelectionListenerを追加し、メッセージ・ボックスを出せるようにします。完全なコードをリスト1に示します。

リスト1.eSWT版のHelloWorld
01 public class HelloWorldeSWT {
02 
03   public static void main(String[] args) {
04     Display display = new Display();
05     final Shell shell = new Shell(display);
06 		
07     Text text = new Text(shell,SWT.SINGLE);
08     text.setText("This is a text");		
09     Button buttonleft = new Button(shell, SWT.PUSH);
10     buttonleft.setText("Left Push!");
11     Button buttonright = new Button(shell, SWT.PUSH);
12     buttonright.setText("Right Push!");
13     buttonright.addSelectionListener(new SelectionListener(){
14       public void widgetSelected(SelectionEvent e) {
15         MessageBox messageBox = new MessageBox(shell,
16           SWT.ICON_INFORMATION| SWT.YES | SWT.NO);
17         messageBox.setText("MessageBox");
18         messageBox.setMessage("Can you see me?");
19         messageBox.open();
20       }
21       public void widgetDefaultSelected(SelectionEvent e) {
22       }});
23     List list = new List(shell,SWT.MULTI|SWT.BORDER);
24     for (int i=0; i<5; i++) {
25 list.add("item "+i);
26     }
27     
28     shell.setText("HelloWorld from eSWT");
29     FormLayout layout = new FormLayout();
30     layout.spacing = 5;
31     layout.marginHeight = layout.marginWidth = 9;
32     shell.setLayout(layout);
33     
34     FormData textData = new FormData();
35     textData.top = new FormAttachment(0);
36     textData.left = new FormAttachment(0);
37     textData.right = new FormAttachment(90);
38     text.setLayoutData(textData);
39     
40     FormData buttonleftData = new FormData();
41     buttonleftData.top = new FormAttachment(text);
42     buttonleftData.left = new FormAttachment(0);
43     buttonleftData.right = new FormAttachment(40);
44     buttonleft.setLayoutData(buttonleftData);
45     
46     FormData buttonrightData = new FormData();
47     buttonrightData.top = new FormAttachment(text);
48     buttonrightData.left = new FormAttachment(buttonleft);
49     buttonright.setLayoutData(buttonrightData);
50     FormData listData = new FormData();
51     
52     listData.top = new FormAttachment(buttonleft);
53     list.setLayoutData(listData);
54     
55     shell.setSize(240,320);
56     shell.open();
57     
58     while (!shell.isDisposed()) {
59 if (!display.readAndDispatch())
60 	display.sleep();
61     }
62     display.dispose();
63   }

図2は、日本語版のPocketPCデバイス上で実行するアプリケーションを示しています。ユーザーがRight Push!ボタンを押すと、メッセージ・ボックスが現れます(図3)。eSWTは、基礎となっているネイティブのグラフィックス・ライブラリー・サポートを利用して、一貫性のあるUIを提供しています(つまり新しいルックは作らず、ネイティブ・アプリケーションのルック・アンド・フィールを利用しています)。

図2.eSWT版のHelloWorld
図2.eSWT版のHelloWorld
図3.ネイティブのルック・アンド・フィールを持つMessageBox
図3.ネイティブのルック・アンド・フィールを持つMessageBox

リスト1を検証する

リスト1で何を行ったのか、1ライン毎に検証してみましょう。

ライン04-05:
ディスプレイとシェルを作成します。シェルは、ディスプレイを自分の親として設定し、最上位レベルのウィンドウとなるようにしています。『最上位レベルのウィンドウ』は、PocketPCプラットフォームでの一貫性を保つために自動的に最大化されます。『final』修飾子を持つシェルが作成されていますが、これは後でSelectionListenerの中で使われます。
ライン07-08:
テキストを作成し、setText() を呼んでテキスト・ストリングを設定します。
ライン09-22:
2つのボタンを作成します。単純なメッセージ・ボックスを出せるように、右ボタンにSelectionListenerを追加します。
ライン23-26:
5つのアイテムを含むリストを作成します。
ライン28:
ウィンドウのタイトル・バー上のテキストを設定します。
ライン29-53:
FormLayoutとFormData、FormAttachmentを使ってレイアウト処理を行います。
ライン55-56:
シェル・サイズを設定し、シェルを開きます。この場合では(デバイスの制約により)、setSize() は最上位レベルのウィンドウには影響を与えません。
ライン 58-61:
while() ループの内部に明示的なループを確立し、オペレーティング・システムから継続的にユーザー・イベントを読み取り、ディスパッチできるようにします。もはやイベントが得られなくなると、display.sleep() が呼ばれ、スリープ状態に入って次のイベントを待機します。
ライン 62:
最後のラインのdisplay.dispose() コールは、明示的にディスプレイを廃棄し、関連する全リソースをeSWTアプリケーションから解放します。

eSWT Expanded

eSWT Expandedはオプショナル・コンポーネントであり、より高度なUI要素やレイアウトを含んでいます。これらの機能は、ハイエンドのモバイル・デバイスやPDAには一般的に見られるものです。表2は、eSWT Expandedの中にあるクラスの詳細リストを示しています。

表2.eSWT Expandedのクラス
org.eclipse.swt.widgetsorg.eclipse.swt.browserorg.eclipse.swt.dndorg.eclipse.swt.graphics
ColorDialogBrowserByteArrayTransferImageLoader
DirectoryDialogLocationEventClipboard-
FontDialogProgressEventTextTransfer-
TableStatusTextEventTransfer-
TreeTitleEventTransferData-

eSWT Expandedの例

Browserウィジェットは、eSWT Expandedの中にある興味深いコントロールです。ここではBrowserコントロールを使って、完全機能のWebブラウザーを作ります(リスト2)。ユーザーは、URLを設定することができ、また先に進んだり前に戻ったり、ページを再ロードしたりすることができます。

リスト2.単純なHTMLブラウザー
public class BrowserTest {
	
	static Button prev, reload, next, go;
	static Text url;
	static Browser browser;
	
	
	public static void main(String[] args) {
		final Display display = new Display();
		Shell shell = new Shell(display);
		
		//set window title and size
		shell.setText("SimpleBrowser");
		shell.setSize(240,320);
		
		//previous button
		prev = new Button(shell, SWT.PUSH);
		prev.setText("<<");
		prev.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				browser.back();
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		//reload button
		reload = new Button(shell, SWT.PUSH);
		reload.setText("R");
		reload.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				browser.refresh();
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		//next button
		next = new Button(shell, SWT.PUSH);
		next.setText(">>");;
		next.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				browser.forward();
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		// url text
		url = new Text(shell, SWT.SINGLE|SWT.BORDER);
		url.setText("http://");
		
		// go button
		go = new Button(shell, SWT.PUSH);
		go.setText("GO");
		go.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				// TODO Auto-generated method stub
				browser.setUrl(url.getText());
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		// browser
		browser = new Browser(shell, SWT.NONE);
		browser.setUrl("http://www.google.com");
		
		FormLayout formLayout = new FormLayout();
		shell.setLayout(formLayout);
		formLayout.spacing = 1;
		formLayout.marginHeight = formLayout.marginWidth = 2;
		
		FormData prevData = new FormData();
		prevData.left = new FormAttachment(0);
		prevData.top = new FormAttachment(0);
		prevData.width = 16;
		prev.setLayoutData(prevData);
		
		FormData reloadData = new FormData();
		reloadData.left = new FormAttachment(prev);
		reloadData.top = new FormAttachment(0);
		reloadData.width = 16;
		reload.setLayoutData(reloadData);
		
		FormData nextData = new FormData();
		nextData.left = new FormAttachment(reload);
		nextData.top = new FormAttachment(0);
		nextData.width = 16;
		next.setLayoutData(nextData);
		
		FormData urlData = new FormData();
		urlData.left =  new FormAttachment(next);
		urlData.top = new FormAttachment(0);
		urlData.right = new FormAttachment(89);
		urlData.bottom = new FormAttachment(browser);
		url.setLayoutData(urlData);
		
		FormData goData = new FormData();
		goData.left = new FormAttachment(url);
		goData.top = new FormAttachment(0);
		goData.width = 24;
		go.setLayoutData(goData);
		
		FormData browserData = new FormData();
		browserData.top = new FormAttachment(prev);
		browserData.left = new FormAttachment(0);
		browserData.right = new FormAttachment(100);
		browserData.bottom = new FormAttachment(100);
		browser.setLayoutData(browserData);
		
		shell.open();
		while( !shell.isDisposed() ) {
			if( !display.readAndDispatch() )
				display.sleep();
		}
		display.dispose();	
	}
}

図4は、PocketPC上で実行している単純なブラウザーを示しています。

図4. 単純なブラウザー
図4. 単純なブラウザー

eSWT Mobile Extensions

eSWT Mobile Extensionsはオプション・コンポーネントであり、様々なモバイル・デバイスに一般的に見られるUI要素を提供しています。表3は、eSWT Mobile Extensionsコンポーネントの中にあるクラスを示しています。

表3.eSWT Mobile Extensionsのクラス
org.eclipse.ercp.swt.mobile
CaptionedControl
Command
ConstrainedText
DateEditor
HyperLink
Input
ListBox/ListBoxItem
MobileDevice/MovileDeviceEvent/MobileDeviceListener
MobileShell
MultiPageDialog
QueryDialog
Screen/ScreenEvent/ScreenListener
SortedList
TaskTip
TextExtension
TimedMessageBox

eSWT Mobile Extensionsの例

この例では、Shellの代わりにMobileShellを使ってフルスクリーン機能を実現します。MobileShellの最上位にはSortedListがあり、最下位にはListViewがあります。コマンドはMobileShellと関連付けられており、ユーザーはフルスクリーン・モードを変更でき、またListViewを使ってレイアウト密度を変更することができます。このソースをリスト3に示します。

リスト3.MobileExtensionの例
public class MobileExtensionSample implements IPlatformRunnable {
	public static void main(String[] args) {
		Display display = new Display();
		final MobileShell shell = new MobileShell(display);
		final Button resetButton = new Button(shell, SWT.PUSH|SWT.BORDER);
		
		Command shellCommand = new Command(shell, Command.SELECT,0);
		shellCommand.setText("FullScreen");
		shellCommand.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				shell.setFullScreenMode(true);
				resetButton.setVisible(true);
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		resetButton.setText("Normal Screen");
		resetButton.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				shell.setFullScreenMode(false);
				resetButton.setVisible(false);
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		// Create SortedList and add items
		SortedList sortedList = new SortedList(
				shell, 
				SWT.MULTI|SWT.V_SCROLL|SWT.BORDER, 
				SortedList.FILTER);
		sortedList.add("banana");
		sortedList.add("123");
		sortedList.add("12");
		sortedList.add("happyhour");
		sortedList.add("toobad");
		sortedList.add("youknowwhat");
		sortedList.add("yes");
		sortedList.add("886222333");
		
		// Create ListView and add items with image set
		Image[] image = new Image[4];
		image[0] = new Image(
				Display.getDefault(), 
				MobileExtensionSample.class.getResource\
				AsStream("/icons/sample.gif"));
		image[1] = new Image(
				Display.getDefault(), 
				MobileExtensionSample.class.getResource\
				AsStream("/icons/sample.gif"));
		image[2] = new Image(
				Display.getDefault(), 
				MobileExtensionSample.class.getResource\
				AsStream("/icons/sample.gif"));
		image[3] = new Image(
				Display.getDefault(), 
				MobileExtensionSample.class.getResource\
				AsStream("/icons/sample.gif"));
		
		final ListView lv = new ListView(shell, SWT.MULTI|SWT.BORDER);
		for (int i=0; i<20; i++) {
			lv.add("item"+i, image[i % 4]);
		}
		
		//Create a Command for setting low density
		Command lowCommand = new Command(lv, Command.SELECT, 0);
		lowCommand.setText("LOW");
		lowCommand.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				lv.setLayoutDensity(ListView.LOW);
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		//Create a Command for setting high density
		Command midCommand = new Command(lv, Command.SELECT, 0);
		midCommand.setText("MEDIUM");
		midCommand.addSelectionListener(new SelectionListener(){
			public void widgetSelected(SelectionEvent e) {
				lv.setLayoutDensity(ListView.MEDIUM);
			}
			public void widgetDefaultSelected(SelectionEvent e) {
			}});
		
		FormLayout layout = new FormLayout();
		layout.spacing = 2;
		layout.marginHeight = layout.marginHeight = 2;
		shell.setLayout(layout);
		FormData sortedListData = new FormData();
		sortedListData.top = new FormAttachment(0);
		sortedListData.left = new FormAttachment(0);
		sortedListData.right = new FormAttachment(100);
		sortedListData.height = 120;
		sortedList.setLayoutData(sortedListData);
		FormData lvData = new FormData();
		lvData.top = new FormAttachment(sortedList);
		lvData.right = new FormAttachment(100);
		lvData.left = new FormAttachment(0);
		lvData.height = 130;
		lv.setLayoutData(lvData);
		FormData resetData = new FormData();
		resetData.top = new FormAttachment(lv);
		resetData.left = new FormAttachment(0);
		resetButton.setLayoutData(resetData);
		resetButton.setVisible(false);
		
		shell.setSize(240,320);
		shell.setText("Mobile Example");
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
}

図5は、PocketPCプラットフォーム上で実行している結果を示しています。そして図6はフルスクリーン・モードを示しています。

図5. SortedListとListViewを使ったMobileShell
図5. SortedListとListViewを使ったMobileShell
図6. フルスクリーンのMobileShell
図6. フルスクリーンのMobileShell

eJFace

eJFaceは、プラットフォームとは独立な、eSWTに依存するUIツールキットです。eJFaceには一連のコンポーネントとヘルプ・ユーティリティーが用意されており、(eSWTウィジェットをラップすることによって)eSWTベースのアプリケーション開発を単純化することができます。これはJFaceとSWTの関係と同じです。実際、eJFaceはJFaceの厳密なサブセットであり、多く点で「いとこ」と似ています。eJFaceは、リソース管理やビューアー、アクション、プレファレンス・ページなどをサポートしています。参考文献に挙げたJFace用のチュートリアルは、eJFaceを使う上でも役に立つはずです。

eJFaceで利用できるビューアー・タイプは下記の通りです。

  • CheckBoxTableViewer
  • CheckBoxTreeViewer
  • ComboViewer
  • ListViewer
  • TableViewer
  • TreeViewer

eWorkbench

eWorkbenchを利用すると、1つのワークベンチ・ウィンドウの中で複数のeRCPアプリケーションを同時に実行することができます(RCPの中での場合と似ています)。eWorkbenchクライアントは特定なディスプレイ・シナリオのためのビューを提供し、またeWorkbenchは使用されているモバイル・デバイスに基づいて、どのビューを使用するかを自動的に決定します。eWorkbenchにはパースペクティブという概念はありません。パースペクティブという概念からすると、アプリケーション同士が埋め込みデバイス上で共有できるパースペクティブは1つしかない、と考えることができます。

eWorkbenchアプリケーションの開発

eWorkbenchアプリケーションを作成するためには、(RCP開発者にはおなじみの)幾つかのステップがあります。このプロセスは、コントリビューション(contribution)の概念を利用してEclipse RCPアプリケーションを作成するプロセスと似ています。

ステップ1: ビューを定義する

eWorkbenchでは、org.eclipse.ui.part.ViewPart を拡張した3つのタイプのビュー(下記)を定義することができます。ノーマル・ビューは必須ですが、他の2つはオプションです。

  • ノーマル・ビュー: デフォルトのビューです
  • ラージ・ビュー: ディスプレイが大きい場合に使われるビューです
  • ステータス・ビュー: ディスプレイが小さい場合に使われるビューです

こんどはサンプルのビューを作ってみましょう。

リスト4.サンプル・ビュー
public class DefaultView extends ViewPart {

	public void createPartControl(Composite parent) { 
	//create a composite with fill layout to host a label
	Composite composite = new Composite(parent, SWT.NONE);
	composite.setLayout(new FillLayout());

	// create a label 
	Label label = new Label(composite,SWT.CENTER); 
	label.setText("Hello eWorkbench!"); }

	public void setFocus() {}
}

extension pointという機構を使って、ビューがあることをEclipseに知らせましょう(リスト5)。

リスト5.plugin.xml
<extension point="org.eclipse.ui.views"> 
	<view allowMultiple="false"
		category="org.eclipse.ercp.eworkbench.viewCategory" 
		class="com.ibm.ercp.application.views.DefaultView" 
		icon="icons/sample.gif"
		id="com.ibm.ercp.application.defaultView" 
		name="Sample DefaultView"/> 
</extension>

ステップ2: eWorkbenchコントリビューションを定義する

eWorkbenchアプリケーションであると見なされるためには、org.eclipse.ercp.eworkbench.applicationsというextension pointを拡張し、下記のような幾つかの情報を提供する必要があります(一例をリスト6に示します)。

  • id: eWorkbenchアプリケーションを表現する固有識別子
  • name: アプリケーションの名前(ワークベンチに表示されます)
  • views: アプリケーションがサポートするビュー(ノーマル、ラージ、サポート)
リスト6.plugin.xml
<extension point="org.eclipse.ercp.eworkbench.applications">
	<application id="com.ibm.ercp.application" name=\
	"IBM Sample Application" singleton="true"> 
		<views normal="com.ibm.ercp.application.views.normal" />
	</application> 
</extension>

図7は、eWorkbenchのアプリケーション・リストと、それに続くサンプル・アプリケーションの起動を、並べて示したスクリーン・ショットです。

図7. Hello, eWorkbench
図7. Hello, eWorkbench

eUpdate

RCPの利点は、アップデート・マネージャー・インターフェースを使って中央サーバーからプラグインをアップグレードできることです。またRCPにはスケジュール・アップデートなど、アップデート管理に関連した機能も用意されています。さらにOGSI(Open Grid Service Infrastructure)とプラグインを使うことによって、動的に機能をインストールすることができます。RCPのこうした利点に対応するものとして、eRCPにはeUpdateがあります。この記事の執筆時点で、eUpdateは活発な開発が行われている最中です。

eUpdateは、アップデート管理機能を含めようとするプラグイン用に、ロジックとUIを提供しています。こうしたプラグインを利用するか、あるいはアップデート関連情報のコンフィギュレーション用に完全なGUIを提供するeUpdateワークベンチ・アプリケーションを利用すれば、独自のアップデート機能を書くことができます。


まとめ

この記事では、eRCP(embedded Rich Client Platform)と、そのコンポーネントについて紹介しました。またeWorkbenchアプリケーションのサンプル・コードや、自己完結的な例として幾つかのコード・リストを解説しました。


ダウンロード

内容ファイル名サイズ
Sample codeos-ecl-rcp-com.ibm.ercp.application_1.0.0.jar25KB

参考文献

学ぶために

製品や技術を入手するために

  • IBMのalphaWorksから最新のEclipse technology downloadsを入手してください。
  • 皆さんの次期オープンソース開発プロジェクトを、IBM trial softwareを使って構築してください。ダウンロード、あるいはDVDで入手することができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=236855
ArticleTitle=Eclipseの埋め込みRCP(embedded Rich Client Platform)を探る
publish-date=03212006