TitleAreaDialog是Eclipse的Jface組件包中提供的一個對話框,它提供了一個可以顯示標題、提示信息以及一個圖標的區域,以及一個包含實際內容的區域,並默認提供了兩個按鈕。最顯著的例子就是新建嚮導和導入導出的嚮導(這兩個粒子都是擴展的Wizard,但對話框本身擴展的WizardDialog,而後者正是從TitleAreaDialog擴展而來)。本文檔詳細介紹如何從TitleAreaDialog創建自己的對話框。本例實現瞭如圖所示的界面:
按照常規方式創建工程,並準備資源文件。其中鑰匙圖標文件是icons/loginkey.gif。本例創建的對話框是WorkListLoginDialog。具體實現可以參考ChooseWorkspaceDialog,本文件實現了在Eclipse啓動時工作區的選擇功能。
默認的,需要重寫createDialogArea。本方法創建了OK和Cancel按鈕上方的內容。一下代碼是本例實現的代碼,添加了詳細的註釋:
protected Control createDialogArea(Composite parent) {
//獲取產品名稱,可以參考本段代碼
String productName = null;
IProduct product = Platform.getProduct();
if (product != null) {
productName = product.getName();//productName就是產品名稱了
}
if (productName == null) {
productName=WorkListPlugin.getResourceString(
"esip.defaultProductName");
}
Composite composite = (Composite)
super.createDialogArea(parent);
//設置圖標,注意我們採用AbstractUIPlugin.imageDescriptorFromPlugin
//從插件的icons目錄中加載,不能直接使用ImageDescriptor. CreateFromFile()
//它需要絕對路徑。而前者通過建立正確的路徑,最終調用了//ImageDescriptor.createFromURL()
setTitleImage(AbstractUIPlugin.imageDescriptorFromPlugin( WorkListPlugin.getDefault().getPluginId(),
"icons/loginkey.gif").createImage());
//設置標題
setTitle(WorkListPlugin
.getResourceString("dialog.title"));
//設置提示信息
setMessage(MessageFormat.format(WorkListPlugin
.getResourceString(
"dialog.message"), new Object[] { productName }));
//自定義要創建的內容
createContentPane(composite);
createLoginControls();
return composite;
}
其中自定義createContentPane創建了一個Composite用於擺放登錄標籤和輸入框,createLoginControls創建了“用戶名”“密碼”標籤和相應的輸入框。如下:
private void createContentPane(Composite parent){
contentPane= new Composite(parent,SWT.NULL);
//採用三列的GridLayout
GridLayout layout=new GridLayout(3,false);
//以下數值通過實驗調整得出,這樣看起來能夠使輸入框在中間位置,比較美觀
layout.marginHeight = 20;
layout.marginWidth = 70;
layout.verticalSpacing = 10;
layout.horizontalSpacing=10;
contentPane.setLayout(layout);
//注意充滿FILL_BOTH
ContentPane.setLayoutData(new GridData(GridData.FILL_BOTH));
contentPane.setFont(parent.getFont());
}
private void createLoginControls(){
//Label user
Label user= new Label(contentPane,SWT.NULL);
//右對齊
GridData layoutData=new GridData(GridData.HORIZONTAL_ALIGN_END);
user.setLayoutData(layoutData);
user.setText(WorkListPlugin
.getResourceString("dialog.login.user"));
//設置提示信息
user.setToolTipText(WorkListPlugin.getResourceString("dialog.login
.userTooltip"));
//Text user
Text userText= new Text(contentPane,SWT.BORDER | SWT.LEAD);
//橫向擴充
layoutData= new GridData(GridData.GRAB_HORIZONTAL
| GridData.FILL_HORIZONTAL);
// horizontalSpan=2 是讓輸入框佔兩個格的位置。這樣看起來比較美觀
layoutData.horizontalSpan=2;
userText.setLayoutData(layoutData);
userText.setToolTipText(WorkListPlugin.getResourceString("dialog.
login.userTooltip"));
//Label password
Label password= new Label(contentPane,SWT.NULL);
layoutData= new GridData(GridData.HORIZONTAL_ALIGN_END);
password.setLayoutData(layoutData);
password.setText(WorkListPlugin.getResourceString("dialog.login.password"));
password.setToolTipText(WorkListPlugin.getResourceString("dialog.
login.passwordTooltip"));
//Text password
Text passwordText= new Text(contentPane,SWT.BORDER | SWT.LEAD);
layoutData= new GridData(GridData.GRAB_HORIZONTAL
| GridData.FILL_HORIZONTAL);
layoutData.horizontalSpan=2;
passwordText.setLayoutData(layoutData);
passwordText.setEchoChar('*');
passwordText.setToolTipText(WorkListPlugin.getResourceString(
"dialog.login.passwordTooltip"));
}
另外可以重寫configureShell,使之正確顯示對話框標題欄:
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(WorkListPlugin.getResourceString("dialog.name"));
}
然後,重新okPressed和cancelPressed,實現當點擊OK或Cancel按鈕時處理事件。
這樣,我們便得到了上如所示的界面。
可見,Eclipse的Jface包爲我們提供了大量的可用的對話框,比如MessageDialog類就提供了openError,openConfirm,openInformation,openQuestion,openWarning等對話框。靈活應用這些接口和函數,可以是我們的界面編寫方便又迅速。
本例沒有實現messageLabel對信息的響應。其實根據需要加入事件監聽器,通過setMessage就可以實現。
小結:擴展TitleAreaDialog,需要重寫createDialogArea以實現自定義界面。另外重寫按鈕事件進行處理。