Eclipse Forms 是 Eclipse 3.0 引入的 UI 工具包,提供類 Web 表單的豐富佈局與控件,廣泛用於 PDE(Plugin Development Environment)等官方編輯器。本文從核心概念入手,通過完整示例演示視圖創建、超鏈接、通用控件佈局與邊框繪製等關鍵技術。
public class FormView extends ViewPart {
private FormToolkit toolkit;
private ScrolledForm form;
@Override
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
form.setText("Hello, Eclipse Forms");
}
@Override
public void setFocus() {
form.setFocus();
}
@Override
public void dispose() {
toolkit.dispose(); // 關鍵:釋放顏色、字體等系統資源
super.dispose();
}
}
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.ui.forms"/> <!-- 必須依賴 -->
</requires>
<extension point="org.eclipse.ui.views">
<view class="org.xqtu.samples.views.FormView" name="Form Sample" id="FormView"/>
</extension>
Composite body = form.getBody();
GridLayout layout = new GridLayout();
body.setLayout(layout);
Hyperlink link = toolkit.createHyperlink(body, "Click here.", SWT.WRAP);
link.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
System.out.println("Link activated!");
}
});
form.getBody() 返回 Composite,可直接設置佈局。toolkit.createHyperlink() 返回樣式統一的 Hyperlink 控件。HyperlinkAdapter 處理點擊、懸停等事件。// 續上例
layout.numColumns = 2;
// 超鏈接跨兩列
GridData gd = new GridData();
gd.horizontalSpan = 2;
link.setLayoutData(gd);
// 標籤 + 文本框
Label label = toolkit.createLabel(body, "Text field label:");
Text text = toolkit.createText(body, "");
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// 關鍵:設置 FLAT 邊框風格
text.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
// 複選框跨兩列
Button checkbox = toolkit.createButton(body, "An example of a checkbox in a form", SWT.CHECK);
gd = new GridData();
gd.horizontalSpan = 2;
checkbox.setLayoutData(gd);
// 統一重繪邊框(實現平面外觀)
toolkit.paintBordersFor(body);
horizontalSpan 對應 colspan。createLabel()、createText()、createButton() 返回的控件自動應用工具包管理的顏色/字體。setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER) 標記toolkit.paintBordersFor(parent) 統一重繪容器內所有標記控件的邊框FormToolkit 內部緩存 Color、Font、Image 等系統資源,必須在 part 銷毀時調用 dispose(),否則會導致句柄洩漏。| 控件 | 創建方法 | 典型用途 |
|---|---|---|
| Hyperlink | createHyperlink() | 導航、命令觸發 |
| ImageHyperlink | createImageHyperlink() | 圖標按鈕 |
| Section | createSection() | 可摺疊內容區塊 |
| ExpandableComposite | createExpandableComposite() | 可展開/摺疊面板 |
| TableWrapLayout | new TableWrapLayout() | 更強大的表格式佈局 |
FormToolkit 創建控件,避免直接 new SWT 控件導致風格不一致。LayoutDebug(org.eclipse.swt.internal.widgets.LayoutDebug)可視化邊界。MasterDetailsBlock 實現主從聯動(如屬性視圖)。