`
dearwolf
  • 浏览: 343627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用RCP实现MSN风格的登录窗口

阅读更多
需要以下的对象:
LoginDialog,用于展示状态,
LoginListener,用于监听登录状态,并根据不同的情况改变LoginDialog的显示
LoginAction,用于执行登录的业务逻辑,并且根据不同的结果来fire不同的动作。

状态一共有以下几种:
1。登录中
2。登录成功
3。登录失败
  3.1 连接失败
  3.2 用户名密码错误
  3.3 .....
4。用户取消登录

下面是代码片段:

Application:


 
  1. public class Application implements IPlatformRunnable {  
  2.        
  3.     /* 
  4.      * (non-Javadoc) 
  5.      *  
  6.      * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object) 
  7.      */  
  8.     public Object run(Object args) throws Exception {  
  9.   
  10.         try {  
  11.   
  12.             TestLoginDialog dialog = new TestLoginDialog(Display.getCurrent()  
  13.                     .getActiveShell());  
  14.             LoginListener loginListener = new LoginListenerImpl(dialog);  
  15.             LoginAction action = new LoginAction("login");  
  16.             action.addLoginListener(loginListener);  
  17.             dialog.setLoginAction(action);  
  18.   
  19.             if (dialog.open() != Window.OK) {  
  20.                 return IPlatformRunnable.EXIT_OK;  
  21.             }  
  22.             int returnCode = PlatformUI.createAndRunWorkbench(display,  
  23.                     new ApplicationWorkbenchAdvisor());  
  24.   
  25.             if (returnCode == PlatformUI.RETURN_RESTART) {  
  26.                 return IPlatformRunnable.EXIT_RESTART;  
  27.             }  
  28.             return IPlatformRunnable.EXIT_OK;  
  29.         } finally {  
  30.             display.dispose();  
  31.         }  
  32.     }  
  33. }  


LoginListener:


 
  1. public interface LoginListener extends EventListener{  
  2.     public void loginError(String message);  
  3.   
  4.     public void loginComplete();  
  5.   
  6.     public void loginCanceled();  
  7.       
  8.     public void loginStarted();  
  9.       
  10. }  


LoginAction:这里要用到Job,因为登录的逻辑处理必须要在异步线程中来做,否则UI就会停住的。


 
  1. public class LoginAction extends Job {  
  2.     private LoginListener loginListener;  
  3.     private Session session = Session.getInstance();  
  4.   
  5.     public LoginAction(String name) {  
  6.         super(name);  
  7.     }  
  8.   
  9.     public void addLoginListener(LoginListener listener) {  
  10.         this.loginListener = listener;  
  11.     }  
  12.   
  13.     public void fireLoginComplete() {  
  14.         loginListener.loginComplete();  
  15.     }  
  16.   
  17.     public void fireLoginStarted() {  
  18.         loginListener.loginStarted();  
  19.     }  
  20.   
  21.     public void fireLoginError(String message) {  
  22.         loginListener.loginError(message);  
  23.     }  
  24.   
  25.     public void fireLoginCanceled() {  
  26.         //write cancel login logic here  
  27.         loginListener.loginCanceled();  
  28.     }  
  29.   
  30.     @Override  
  31.     protected IStatus run(IProgressMonitor monitor) {  
  32.         login();  
  33.         return Status.OK_STATUS;  
  34.     }  
  35.   
  36.     public boolean login() {  
  37.         fireLoginStarted();  
  38.   
  39.         if (//网络连接失败) {  
  40.             fireLoginError(Messages.getString("Session.connectionFailed"));  
  41.         } else {  
  42.             if (//登录失败) {  
  43.             fireLoginError(Messages.getString("Session.loginFailed"));  
  44.             } else {  
  45.                 session.setAuthenticated(true);  
  46.                 fireLoginComplete();  
  47.                 //处理登录动作  
  48.             }  
  49.         }  
  50.         return session.isAuthenticated();  
  51.     }  
  52.   
  53. }  

LoginDialog:

这里用到了StackLayout,因为在登录的过程中,需要在显示用户名/密码的位置上,显示gif动画,所以在createDialogArea的时候,要创建一个主Composite,然后将其layout设置为StackLayout,然后创建两个Composite,将其parent都设置为主Composite,新创建的两个我将其命名为loginInfoComposite和loginAnimaComposite,顾名思义,一个用来显示登录信息,一个用来显示登录动画。

关于如何显示gif,我在这里就不多说了,因为SWT Snippet和Eclipse的SWT Example里面都有对应的例子,我在这里推荐大家去参考一下SWT Example,因为那里面是用Canvas来绘图的,这也是我们所需要的。

在使用StackLayout的时候要注意,当我们使用stackLayout.topControl = xxx的时候,还要调用stackLayout.layout()方法,否则会不起作用。

还有就是因为在登录的过程中,按钮栏应该是不可见的,但是Dialog的getButtonBar方法是protected的,所以就重写了这个方法,声明为public,返回super.getButtonBar(),虽然源码的注释中写着这个方法不应该重写,但是我想,这样子应该没问题吧。

另外,在绘制gif的下方添加一个按钮,并且addSelectionListener,当SelectionEvent发生的时候,就去触发loginAction的fireCancel方法就可以了。

细节就不描述了,下面是一些个人认为比较关键的代码片段:


 
  1. /* 
  2.  * to create login button  
  3.  */  
  4. public static int LOGIN_ID = 9527;  


 
  1. protected void createButtonsForButtonBar(Composite parent) {  
  2.     createButton(parent, LOGIN_ID, Messages  
  3.             .getString("LoginDialog.loginbutton"), true); ]  
  4.     createButton(parent, IDialogConstants.CANCEL_ID, Messages  
  5.             .getString("LoginDialog.cancelbutton"), false);  
  6. }  


 
  1. @Override  
  2. protected void buttonPressed(int buttonId) {  
  3.     if (buttonId == LOGIN_ID) {  
  4.         loginPressed();  
  5.     }  
  6.     super.buttonPressed(buttonId);  
  7. }  


 
  1. protected void loginPressed() {  
  2.     //...  
  3.     loginAction.schedule();  
  4. }  

然后是LoginListener的实现类:


 
  1. public class LoginListenerImpl implements LoginListener {  
  2.     private Display display;  
  3.     //login dialog  
  4.     private TestLoginDialog dialog;  
  5.     //image to show on login failed  
  6.     private Image errorMessageImage = AbstractUIPlugin  
  7.             .imageDescriptorFromPlugin(Application.PLUGIN_ID,  
  8.                     IImageKeys.crodoTitleImage).createImage();  
  9.     //error message area background  
  10.     private Color errorMessageBackground = new Color(null2552550);  
  11.   
  12.     public LoginListenerImpl(TestLoginDialog dialog) {  
  13.         this.dialog = dialog;  
  14.         display = Display.getCurrent();  
  15.     }  
  16.   
  17.     //因为这里需要在非UI线程中更新UI,所以要用display.syncExec()方法。  
  18.     public void loginCanceled() {  
  19.         display.syncExec(new Runnable() {  
  20.             public void run() {  
  21.                 dialog.getStackLayout().topControl = dialog  
  22.                         .getLoginInfoComposite();  
  23.                 dialog.getStackLayoutComposite().layout();  
  24.                 dialog.animate();  
  25.                 dialog.getButtonBar().setVisible(true);  
  26.             }  
  27.         });  
  28.     }  
  29.   
  30.     public void loginComplete() {  
  31.         display.syncExec(new Runnable() {  
  32.             @SuppressWarnings("deprecation")  
  33.             public void run() {  
  34.                 //我知道Thread.stop()方法已经被废弃,但是暂时没想到什么方法来中止  
  35.                 //就暂时这样子用了,还请大家指教!  
  36.                 dialog.getAnimateThread().stop();  
  37.                 dialog.okPressed();  
  38.             }  
  39.         });  
  40.     }  
  41.   
  42.     public void loginError(final String message) {  
  43.         display.syncExec(new Runnable() {  
  44.             public void run() {  
  45.                 dialog.getErrorMessageLabel().setText(message);  
  46.                 dialog.getErrorMessageLabel().setImage(errorMessageImage);  
  47.                 dialog.getErrorMessageLabel().setBackground(  
  48.                         errorMessageBackground);  
  49.                 dialog.getStackLayout().topControl = dialog  
  50.                         .getLoginInfoComposite();  
  51.                 dialog.getStackLayoutComposite().layout();  
  52.                 dialog.animate();  
  53.                 dialog.getButtonBar().setVisible(true);  
  54.             }  
  55.         });  
  56.     }  
  57.   
  58.     public void loginStarted() {  
  59.         display.syncExec(new Runnable() {  
  60.             public void run() {  
  61.                 dialog.getStackLayout().topControl = dialog  
  62.                         .getLoginAnimaComposite();  
  63.                 dialog.getStackLayoutComposite().layout();  
  64.                 dialog.animate();  
  65.                 dialog.getButtonBar().setVisible(false);  
  66.             }  
  67.         });  
  68.     }  
分享到:
评论
11 楼 qiubite520 2012-01-16  
求登陆这块的完整代码,378657535@qq.com,谢谢
10 楼 dearwolf 2007-06-05  
楼上是在做梦么?
9 楼 niehanzi 2007-05-21  
请问这个朋友,能不能把这的这项功能的完整代码发给我谢谢!,我的email地址是kedahanzi@163.com
8 楼 kevinhe826 2007-05-16  
请问这个朋友,能不能把这的这项功能的完整代码发给我谢谢!E-mail:5517658@163.com  xp188@126.com
7 楼 kevinhe826 2007-05-16  
请问这位朋友能不能把这项目的完整代码发给我谢谢! 我的E-mail:5517658@163.com
6 楼 dearwolf 2007-01-25  
pirateship 写道
你好,我现在也在进行RCP的开发,也想实现像你这样的登录界面,但是我把我的LoginDialog放到Application中的时候就报错,我的LoginDialog实现的是jface.Dialog,请教一下这是怎么回事?谢谢
<br/>
<br/>
贴一下代码啊,要不然我怎么知道怎么回事....
5 楼 dearwolf 2007-01-25  
。。。
4 楼 partech 2007-01-24  
<p>
pirateship 写道
你好,我现在也在进行RCP的开发,也想实现像你这样的登录界面,但是我把我的LoginDialog放到Application中的时候就报错,我的LoginDialog实现的是jface.Dialog,请教一下这是怎么回事?谢谢
</p>
<p>你可以试一下在自己的ApplicationWorkbenchAdvisor里重写openwindows。</p>
3 楼 pirateship 2007-01-24  
你好,我现在也在进行RCP的开发,也想实现像你这样的登录界面,但是我把我的LoginDialog放到Application中的时候就报错,我的LoginDialog实现的是jface.Dialog,请教一下这是怎么回事?谢谢
2 楼 dearwolf 2006-12-26  
哦,是这个样子的啊,看到过这样的实现,但是不知道为什么一直没看懂,现在明白啦:)谢谢!
1 楼 dwangel 2006-12-26  
现在线程的中断实际上是自己负责了,
定一个中断标志的成员变量,然后在运行中检查这个标志,
如果为真则退出循环之类的。

class TT extends Runnable {
  private int flag=1;
  public void run() {
    while (flag == 1) {
       try {
          Thread.sleep(10000);
       }catch (Exception e) {
       }
    }
  }
  public void stopThread() {
    flag = 0;
  }
}

相关推荐

    RCP项目的登录窗体 RCP项目的登录窗体

    RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体

    基于eclipse RCP实现的邮件管理客户端rcpmail

    rcpmail是基于Eclipse RCP构建的一个邮件管理客户端,它展示了如何利用RCP框架开发出具有用户友好的界面和高效功能的应用程序。 首先,我们来理解Eclipse RCP的核心概念。RCP是Eclipse IDE的基础,它提供了构建可...

    rcp欢迎界面

    在RCP应用程序中,欢迎界面通常是通过intro扩展点来实现的。 intro扩展点 intro扩展点是RCP应用程序中的一种扩展点,用于定义欢迎界面的内容和行为。intro扩展点由三个部分组成:intro、config和configExtension。...

    rcp定制应用程序窗口属性

    在开发Java RCP(Rich Client Platform)应用程序时,有时需要对默认的...通过以上步骤,我们可以对RCP应用程序的窗口属性进行深度定制,提供更符合用户需求的界面体验。记住,持续优化和改进是提升用户体验的关键。

    RCP,RCP开发

    RCP提供了一个灵活的基础平台,允许开发者利用插件系统来扩展应用程序的功能,而无需从头开始编写整个用户界面。通过RCP,开发者可以专注于业务逻辑,而UI组件和框架已经由RCP提供,大大提高了开发效率。 **RCP核心...

    RCP 实现ATM机器原码

    在本项目中,“RCP实现ATM机器原码”指的是使用RCP协议开发的ATM机软件的源代码。 RCP(Remote Communication Protocol)是一种用于设备间通信的协议,特别是在分布式系统中,如ATM网络。它定义了数据传输的格式、...

    RCP 界面布局实例

    RCP界面布局实例着重于如何在RCP应用程序中有效地组织和管理用户界面元素,使得用户能够高效地与应用进行交互。本文将深入探讨RCP界面布局的相关知识点,并基于提供的"com.rcp.steve.crm"这一文件名,我们可以推测这...

    基于Eclipse RCP Email客户端的实现

    《基于Eclipse RCP Email客户端的实现》这篇本科毕业设计论文详细探讨了如何利用Java语言,结合Eclipse插件开发技术、RCP(Rich Client Platform)、EMF(Eclipse Modeling Framework)以及Java Mail工具包来构建一个...

    基于适配器模式的RCP应用属性视图实现

    本文将深入探讨如何在基于Eclipse RCP(Rich Client Platform)的应用中,利用适配器模式实现自定义的属性视图。Eclipse RCP是一个强大的框架,用于构建桌面应用程序,而属性视图则是展示对象属性的一种可视化组件。...

    实现RCP在线升级说明

    ### 实现RCP在线升级说明 #### 一、前言 本文将详细介绍如何实现RCP(Rich Client Platform)客户端的在线升级功能。RCP是一种基于Eclipse框架的应用程序开发技术,它允许开发者构建功能丰富的桌面应用程序。随着...

    Eclipse RCP程序ViewPart占位功能的实现

    本教程将深入探讨如何在Eclipse RCP程序中实现ViewPart的占位功能,这对于构建具有多视图的工作环境至关重要。 首先,我们需要理解ViewPart的基本概念。在Eclipse RCP中,ViewPart是用户界面中的一个组件,它通常...

    Eclipse Rcp

    Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许...Eclipse RCP的应用程序继承了Eclipse的风格与功能,通过RCP构建的应用程序可以脱离Eclipse环境独立运行,这对于开发Java桌面应用程序具有重要的意义。

    用RCP构建GEF程序

    【用RCP构建GEF程序】的PPT教程主要涵盖了Eclipse Rich Client Platform (RCP)和Graphical Editing Framework (GEF)的应用。Eclipse RCP是一个强大的开发平台,广泛应用于构建桌面应用程序,如GIS系统、高级项目管理...

    定制 SWT RCP 界面--如何编写一个漂亮的 SWT

    ### 定制SWT RCP界面—如何编写一个漂亮的SWT RCP界面 #### 引言 在现代软件开发中,用户界面(UI)的设计至关重要。一个美观且易用的界面不仅能提升用户体验,还能增强软件的整体竞争力。SWT (Standard Widget ...

    Eclipse rcp 实现文本内容对比功能

    在本文中,我们将深入探讨如何使用Eclipse RCP(Rich Client Platform)实现文本内容的对比功能。Eclipse RCP是一个强大的开发框架,它允许开发者构建桌面应用,而文本内容对比则是许多开发工具中的一个基本特性,...

    基于RCP实现图书销售管理系统

    《基于RCP实现图书销售管理系统》 图书销售管理系统是一个典型的业务信息系统,它的核心目标是有效管理图书库存,跟踪销售情况,以及提供用户友好的界面进行数据查询和操作。本系统采用RCP(Rich Client Platform)...

    RCP 开发实例 源码

    RCP的核心理念是将应用程序的界面、业务逻辑和数据管理分离,从而实现模块化、组件化的开发。 在"RCP 开发实例 源码"中,我们可以看到一个没有涉及数据库连接的纯界面应用示例。这样的例子通常会聚焦于UI设计和事件...

    Eclipse RCP开发教程

    1.2. Eclipse RCP 构建风格 RCP 应用的基础是插件(Plugin),它们提供具体的功能;扩展点(Extension Point)则定义了插件可以插入的地方,允许其他插件进行扩展;而扩展(Extension)则是插件实际实现扩展点的过程...

    RCP中adapter实现属性视图

    在Eclipse RCP(Rich Client Platform)开发中,适配器(Adapter)机制是一个核心概念,它使得组件之间能够解耦合,实现灵活的交互。本文将深入探讨如何在RCP应用中通过适配器实现属性视图(Property View),以展示...

    使用RCP进行程序开发(学习篇)

    3. **布局和界面**:RCP允许开发者自定义窗口布局,创建和管理视图,以及添加自定义的操作和事件处理。 通过以上步骤和组件,开发者可以构建出具有高度定制化界面和功能的桌面应用程序。RCP的强大在于其灵活性和可...

Global site tag (gtag.js) - Google Analytics