Eclipse界面編寫實例(1)--擴展TitleAreaDialog

    TitleAreaDialogEclipseJface組件包中提供的一個對話框,它提供了一個可以顯示標題、提示信息以及一個圖標的區域,以及一個包含實際內容的區域,並默認提供了兩個按鈕。最顯著的例子就是新建嚮導和導入導出的嚮導(這兩個粒子都是擴展的Wizard,但對話框本身擴展的WizardDialog,而後者正是從TitleAreaDialog擴展而來)。本文檔詳細介紹如何從TitleAreaDialog創建自己的對話框。本例實現瞭如圖所示的界面:

    按照常規方式創建工程,並準備資源文件。其中鑰匙圖標文件是icons/loginkey.gif。本例創建的對話框是WorkListLoginDialog。具體實現可以參考ChooseWorkspaceDialog,本文件實現了在Eclipse啓動時工作區的選擇功能。

    默認的,需要重寫createDialogArea。本方法創建了OKCancel按鈕上方的內容。一下代碼是本例實現的代碼,添加了詳細的註釋:

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"));

    }

然後,重新okPressedcancelPressed,實現當點擊OKCancel按鈕時處理事件。

    這樣,我們便得到了上如所示的界面。

    可見,EclipseJface包爲我們提供了大量的可用的對話框,比如MessageDialog類就提供了openError,openConfirm,openInformation,openQuestion,openWarning等對話框。靈活應用這些接口和函數,可以是我們的界面編寫方便又迅速。

    本例沒有實現messageLabel對信息的響應。其實根據需要加入事件監聽器,通過setMessage就可以實現。

    小結:擴展TitleAreaDialog,需要重寫createDialogArea以實現自定義界面。另外重寫按鈕事件進行處理。
發佈了32 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章