<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 28, comments - 27, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    需要以下的對象:
    LoginDialog,用于展示狀態(tài),
    LoginListener,用于監(jiān)聽登錄狀態(tài),并根據(jù)不同的情況改變LoginDialog的顯示
    LoginAction,用于執(zhí)行登錄的業(yè)務(wù)邏輯,并且根據(jù)不同的結(jié)果來fire不同的動作。

    狀態(tài)一共有以下幾種:
    1。登錄中
    2。登錄成功
    3。登錄失敗
    ? 3.1 連接失敗
    ? 3.2 用戶名密碼錯誤
    ? 3.3 .....
    4。用戶取消登錄

    下面是代碼片段:

    Application;

    public?class?Application?implements?IPlatformRunnable?{
    ?
    ???
    ????
    /*
    ?????*?(non-Javadoc)
    ?????*?
    ?????*?@see?org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
    ?????
    */
    ????
    public?Object?run(Object?args)?throws?Exception?{

    ????????
    try?{

    ????????????TestLoginDialog?dialog?=?new?TestLoginDialog(Display.getCurrent()
    ????????????????????.getActiveShell());
    ????????????LoginListener?loginListener?
    =?new?LoginListenerImpl(dialog);
    ????????????LoginAction?action?
    =?new?LoginAction("login");
    ????????????action.addLoginListener(loginListener);
    ????????????dialog.setLoginAction(action);

    ????????????
    if?(dialog.open()?!=?Window.OK)?{
    ????????????????
    return?IPlatformRunnable.EXIT_OK;
    ????????????}
    ????????????
    int?returnCode?=?PlatformUI.createAndRunWorkbench(display,
    ????????????????????
    new?ApplicationWorkbenchAdvisor());

    ????????????
    if?(returnCode?==?PlatformUI.RETURN_RESTART)?{
    ????????????????
    return?IPlatformRunnable.EXIT_RESTART;
    ????????????}
    ????????????
    return?IPlatformRunnable.EXIT_OK;
    ????????}?
    finally?{
    ????????????display.dispose();
    ????????}
    ????}
    }


    LoginListener:

    public?interface?LoginListener?extends?EventListener{
    ????
    public?void?loginError(String?message);

    ????
    public?void?loginComplete();

    ????
    public?void?loginCanceled();
    ????
    ????
    public?void?loginStarted();
    ????
    }


    LoginAction:這里要用到Job,因為登錄的邏輯處理必須要在異步線程中來做,否則UI就會停住的。

    public?class?LoginAction?extends?Job?{
    ????
    private?LoginListener?loginListener;
    ????
    private?Session?session?=?Session.getInstance();

    ????
    public?LoginAction(String?name)?{
    ????????
    super(name);
    ????}

    ????
    public?void?addLoginListener(LoginListener?listener)?{
    ????????
    this.loginListener?=?listener;
    ????}

    ????
    public?void?fireLoginComplete()?{
    ????????loginListener.loginComplete();
    ????}

    ????
    public?void?fireLoginStarted()?{
    ????????loginListener.loginStarted();
    ????}

    ????
    public?void?fireLoginError(String?message)?{
    ????????loginListener.loginError(message);
    ????}

    ????
    public?void?fireLoginCanceled()?{
    ??? ??? //write cancel login logic here
    ????????loginListener.loginCanceled();
    ????}

    ????@Override
    ????
    protected?IStatus?run(IProgressMonitor?monitor)?{
    ????????login();
    ????????
    return?Status.OK_STATUS;
    ????}

    ????
    public?boolean?login()?{
    ????????fireLoginStarted();

    ????????if?(//網(wǎng)絡(luò)連接失敗)?{
    ???????????
    fireLoginError(Messages.getString("Session.connectionFailed"));
    ????????}?
    else?{
    ????????????
    if?(//登錄失敗)?{
    ???????????
    fireLoginError(Messages.getString("Session.loginFailed"));
    ????????????}?
    else?{
    ????????????????session.setAuthenticated(
    true);
    ????????????????fireLoginComplete();
    ??? ??? ??? ??? //處理登錄動作
    ????????????}
    ????????}
    ????????
    return?session.isAuthenticated();
    ????}

    }


    LoginDialog:

    這里用到了StackLayout,因為在登錄的過程中,需要在顯示用戶名/密碼的位置上,顯示gif動畫,所以在createDialogArea的時候,要創(chuàng)建一個主Composite,然后將其layout設(shè)置為StackLayout,然后創(chuàng)建兩個Composite,將其parent都設(shè)置為主Composite,新創(chuàng)建的兩個我將其命名為loginInfoComposite和loginAnimaComposite,顧名思義,一個用來顯示登錄信息,一個用來顯示登錄動畫。

    關(guān)于如何顯示gif,我在這里就不多說了,因為SWT Snippet和Eclipse的SWT Example里面都有對應(yīng)的例子,我在這里推薦大家去參考一下SWT Example,因為那里面是用Canvas來繪圖的,這也是我們所需要的。

    在使用StackLayout的時候要注意,當(dāng)我們使用stackLayout.topControl = xxx的時候,還要調(diào)用stackLayout.layout()方法,否則會不起作用。

    還有就是因為在登錄的過程中,按鈕欄應(yīng)該是不可見的,但是Dialog的getButtonBar方法是protected的,所以就重寫了這個方法,聲明為public,返回super.getButtonBar(),雖然源碼的注釋中寫著這個方法不應(yīng)該重寫,但是我想,這樣子應(yīng)該沒問題吧。

    另外,在繪制gif的下方添加一個按鈕,并且addSelectionListener,當(dāng)SelectionEvent發(fā)生的時候,就去觸發(fā)loginAction的fireCancel方法就可以了。

    細節(jié)就不描述了,下面是一些個人認為比較關(guān)鍵的代碼片段:

    ????/*
    ?????*?to?create?login?button?
    ?????
    */
    ????
    public?static?int?LOGIN_ID?=?9527;


    ????protected?void?createButtonsForButtonBar(Composite?parent)?{
    ????????createButton(parent,?LOGIN_ID,?Messages
    ????????????????.getString(
    "LoginDialog.loginbutton"),?true);?]
    ????????createButton(parent,?IDialogConstants.CANCEL_ID,?Messages
    ????????????????.getString(
    "LoginDialog.cancelbutton"),?false);
    ????}


    ????@Override
    ????
    protected?void?buttonPressed(int?buttonId)?{
    ????????
    if?(buttonId?==?LOGIN_ID)?{
    ????????????loginPressed();
    ????????}
    ????????
    super.buttonPressed(buttonId);
    ????}


    ??? protected?void?loginPressed()?{
    ??? ??? //...
    ????????loginAction.schedule();
    ????}

    然后是LoginListener的實現(xiàn)類:

    public?class?LoginListenerImpl?implements?LoginListener?{
    ????
    private?Display?display;
    ????
    //login?dialog
    ????private?TestLoginDialog?dialog;
    ????
    //image?to?show?on?login?failed
    ????private?Image?errorMessageImage?=?AbstractUIPlugin
    ????????????.imageDescriptorFromPlugin(Application.PLUGIN_ID,
    ????????????????????IImageKeys.crodoTitleImage).createImage();
    ????
    //error?message?area?background
    ????private?Color?errorMessageBackground?=?new?Color(null,?255,?255,?0);

    ????
    public?LoginListenerImpl(TestLoginDialog?dialog)?{
    ????????
    this.dialog?=?dialog;
    ????????display?
    =?Display.getCurrent();
    ????}

    ??? //因為這里需要在非UI線程中更新UI,所以要用display.syncExec()方法。
    ????public?void?loginCanceled()?{
    ????????display.syncExec(
    new?Runnable()?{
    ????????????
    public?void?run()?{
    ????????????????dialog.getStackLayout().topControl?
    =?dialog
    ????????????????????????.getLoginInfoComposite();
    ????????????????dialog.getStackLayoutComposite().layout();
    ????????????????dialog.animate();
    ????????????????dialog.getButtonBar().setVisible(
    true);
    ????????????}
    ????????});
    ????}

    ????
    public?void?loginComplete()?{
    ????????display.syncExec(
    new?Runnable()?{
    ????????????@SuppressWarnings(
    "deprecation")
    ????????????
    public?void?run()?{
    ??? ??? ??? ??? //我知道Thread.stop()方法已經(jīng)被廢棄,但是暫時沒想到什么方法來中止
    ??? ??? ??? ??? //就暫時這樣子用了,還請大家指教!
    ????????????????dialog.getAnimateThread().stop();
    ????????????????dialog.okPressed();
    ????????????}
    ????????});
    ????}

    ????
    public?void?loginError(final?String?message)?{
    ????????display.syncExec(
    new?Runnable()?{
    ????????????
    public?void?run()?{
    ????????????????dialog.getErrorMessageLabel().setText(message);
    ????????????????dialog.getErrorMessageLabel().setImage(errorMessageImage);
    ????????????????dialog.getErrorMessageLabel().setBackground(
    ????????????????????????errorMessageBackground);
    ????????????????dialog.getStackLayout().topControl?
    =?dialog
    ????????????????????????.getLoginInfoComposite();
    ????????????????dialog.getStackLayoutComposite().layout();
    ????????????????dialog.animate();
    ????????????????dialog.getButtonBar().setVisible(
    true);
    ????????????}
    ????????});
    ????}

    ????
    public?void?loginStarted()?{
    ????????display.syncExec(
    new?Runnable()?{
    ????????????
    public?void?run()?{
    ????????????????dialog.getStackLayout().topControl?
    =?dialog
    ????????????????????????.getLoginAnimaComposite();
    ????????????????dialog.getStackLayoutComposite().layout();
    ????????????????dialog.animate();
    ????????????????dialog.getButtonBar().setVisible(
    false);
    ????????????}
    ????????});
    ????}


    評論

    # re: [rcp系列]用RCP實現(xiàn)MSN風(fēng)格的登錄窗口  回復(fù)  更多評論   

    2006-09-27 10:15 by 123bingbing
    想學(xué)編程?來www.mylinux.com吧,這里將成為你成長的新起點!

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品免费网站| 9久热精品免费观看视频| 在线观看亚洲人成网站| 久久久久亚洲AV无码专区首| 久久亚洲国产精品成人AV秋霞| 99久久99这里只有免费的精品| 91成人免费在线视频| AV在线亚洲男人的天堂| 日产亚洲一区二区三区| 九九免费观看全部免费视频| 免费看男人j放进女人j免费看| 4399好看日本在线电影免费| 亚洲精品无码久久久久久久 | 亚洲永久网址在线观看| 亚洲AV噜噜一区二区三区| 国产性生大片免费观看性| 国产精品久免费的黄网站| 亚洲高清国产拍精品26U| 亚洲人成人无码.www石榴| 色猫咪免费人成网站在线观看| 青青青国产免费一夜七次郎 | 亚洲精品电影在线| 免费一本色道久久一区| 亚洲av一综合av一区| 一级视频免费观看| 黑人精品videos亚洲人| 免费的黄色的网站| 搡女人真爽免费视频大全| 亚洲成年人电影网站| 四虎国产成人永久精品免费| 亚洲va在线va天堂va手机| 久久久免费的精品| 91丁香亚洲综合社区| 成全视频在线观看免费高清动漫视频下载 | 久久亚洲AV成人无码电影| 成人AV免费网址在线观看| 麻豆亚洲AV永久无码精品久久| 中字幕视频在线永久在线观看免费 | 中文字幕无码精品亚洲资源网| 亚洲美国产亚洲AV| 337p日本欧洲亚洲大胆裸体艺术|