承接上篇,本文深入實戰:使用 SWT FormToolkit 構建視圖、整合 EJB 呼叫、定製 RCP 工作台與透視圖、導出獨立部署包,構建生產級富客戶端應用。
導入預備的 TemperatureView 類,核心兩方法:
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
form.setText("Celsius to Fahrenheit Temperature Converter");
GridLayout layout = new GridLayout(2, false);
form.getBody().setLayout(layout);
Label label = toolkit.createLabel(form.getBody(), "Enter temperature in Celsius: ");
Text textBox = toolkit.createText(form.getBody(), "", SWT.BORDER);
textBox.setLayoutData(new GridData(80));
Button button = toolkit.createButton(form.getBody(), "Convert to Fahrenheit", SWT.PUSH);
Label result = toolkit.createLabel(form.getBody(), "");
result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
MyListener listener = new MyListener();
listener.setInput(textBox);
listener.setResult(result);
listener.setParent(parent);
listener.setFormToolkit(toolkit);
button.addListener(SWT.Selection, listener);
}
要點:FormToolkit 統一外觀、GridLayout 彈性佈局、GridData 控制組件佔比。
public void handleEvent(Event event) {
try {
InitialContext ctx = new InitialContext();
String jndi = RcpMessages.getString("TemperatureView.JNDIName"); // ejb/TempConverter
Object obj = ctx.lookup(jndi);
TempConverterHome home = (TempConverterHome) PortableRemoteObject.narrow(obj, TempConverterHome.class);
TempConverter service = home.create();
int retVal = service.celciusToFarenheight(Integer.parseInt(textBox.getText()));
result.setText(textBox.getText() + "°C ≈ " + retVal + "°F");
} catch (Exception th) {
result.setText(th.getClass().getSimpleName() + ": " + th.getMessage());
}
}
架構建議:實際專案應引入 Business Delegate 模式 隔離 EJB 呼叫細節,View 僅持有 Delegate 引用。
# plugin.properties
TemperatureView.JNDIName=ejb/TempConverter
TemperatureView.Title=Celsius to Fahrenheit Temperature Converter
TemperatureView.Button=Convert to Fahrenheit
部署時只需修改屬性文件即可適配不同環境 JNDI 名稱。
<extension point="org.eclipse.ui.views">
<category name="Temperature Category" id="com.ibm.issw.temperature.form"/>
<view name="Temperature View" icon="icons/sample.gif"
category="com.ibm.issw.temperature.form"
class="com.ibm.issw.temperature.form.views.TemperatureView"
id="com.ibm.issw.temperature.form.views.TemperatureView"/>
</extension>
預設 Eclipse Workbench 面向 IDE,需定製專屬工作台:
public class RcpWorkbenchAdvisor extends WorkbenchAdvisor {
public String getInitialWindowPerspectiveId() { return "MyRCPPerspective"; }
public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
configurer.setInitialSize(new Point(750, 600));
configurer.setShowCoolBar(false); // 隱藏工具欄
configurer.setShowStatusLine(false); // 隱藏狀態欄
configurer.setTitle("Temperature Converter");
}
}
public class MyRCPPerspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
layout.addView("com.ibm.issw.temperature.form.views.TemperatureView",
IPageLayout.LEFT, 0.66f, IPageLayout.ID_EDITOR_AREA);
layout.setEditorAreaVisible(false); // 無編輯器區域
}
}
public class TempRCPApplication implements IPlatformRunnable {
public Object run(Object args) {
WorkbenchAdvisor advisor = new RcpWorkbenchAdvisor();
Display display = PlatformUI.createDisplay();
try {
int code = PlatformUI.createAndRunWorkbench(display, advisor);
return (code == PlatformUI.RETURN_RESTART) ?
IPlatformRunnable.EXIT_RESTART : IPlatformRunnable.EXIT_OK;
} finally { display.dispose(); }
}
}
<extension point="org.eclipse.core.runtime.applications">
<application>
<run class="TempRCPApplication"/>
</application>
</extension>
<extension point="org.eclipse.ui.perspectives">
<perspective class="MyRCPPerspective"
name="com.ibm.issw.temperature.form.perspective1"
id="MyRCPPerspective"/>
</extension>
com.ibm.issw.temperature.form.RcpApplication-Djava.naming.provider.url=corbaloc::localhost
-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
-Dserver.root=C:\WebSphere6ND\AppClient
-Dcom.ibm.CORBA.ConfigURL=file:C:\WebSphere6ND\AppClient/properties/sas.client.props
-Djava.ext.dirs="C:\WebSphere6ND\AppClient\java\jre\lib\ext;...;properties"
startup.jar 及核心插件至部署目錄:org.eclipse.core.runtime_3.0.1
org.eclipse.osgi_3.0.1
org.eclipse.swt.win32_3.0.1
org.eclipse.ui.workbench_3.0.1
org.eclipse.ui.forms_3.0.0
... (共 13 個核心插件)
MyRCPApp.bat:set WAS_CLIENT_HOME=C:\WebSphere6ND\AppClient
start %WAS_CLIENT_HOME%\java\jre\bin\javaw
-Djava.naming.provider.url=corbaloc::localhost
-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
-Dserver.root=%WAS_CLIENT_HOME%
-Dcom.ibm.CORBA.ConfigURL=file:%WAS_CLIENT_HOME%/properties/sas.client.props
-Djava.ext.dirs=%WAS_CLIENT_HOME%\java\jre\lib\ext;...;%WAS_CLIENT_HOME%\properties
-cp startup.jar org.eclipse.core.launcher.Main
-application com.ibm.issw.temperature.form.RcpApplication
集群調用提示:生產環境 corbaloc::host1:port,host2:port 格式指定多節點。
手動複製易誤,建議採用:
build.xml本系列完整展示了 Eclipse RCP 整合 WebSphere EJB 的端到端流程:從 EJB 部署、插件開發、視圖構建、工作台定製到獨立部署,為企業級富客戶端開發提供參考範本。