- 浏览: 343627 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
fengjingxianjing:
凤舞凰扬的话 -
qiubite520:
求登陆这块的完整代码,378657535@qq.com,谢谢
用RCP实现MSN风格的登录窗口 -
renyanwei:
可是现在怎么看还是1.4呢
InfoQ中文站正式升级为1.5版 -
malk:
ray_linn 写道作者可以和罗时飞一拼了,无论从语无伦次, ...
书评:《敏捷软件开发》中文版第二版 -
sleekengine:
一路看下来的感想:1)看来还是有能够翻译的不错的好手2)翻译也 ...
书评:《敏捷软件开发》中文版第二版
需要以下的对象:
LoginDialog,用于展示状态,
LoginListener,用于监听登录状态,并根据不同的情况改变LoginDialog的显示
LoginAction,用于执行登录的业务逻辑,并且根据不同的结果来fire不同的动作。
状态一共有以下几种:
1。登录中
2。登录成功
3。登录失败
3.1 连接失败
3.2 用户名密码错误
3.3 .....
4。用户取消登录
下面是代码片段:
Application:
LoginListener:
LoginAction:这里要用到Job,因为登录的逻辑处理必须要在异步线程中来做,否则UI就会停住的。
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方法就可以了。
细节就不描述了,下面是一些个人认为比较关键的代码片段:
然后是LoginListener的实现类:
<br/>
贴一下代码啊,要不然我怎么知道怎么回事....
LoginDialog,用于展示状态,
LoginListener,用于监听登录状态,并根据不同的情况改变LoginDialog的显示
LoginAction,用于执行登录的业务逻辑,并且根据不同的结果来fire不同的动作。
状态一共有以下几种:
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 (//网络连接失败) {
- fireLoginError(Messages.getString("Session.connectionFailed"));
- } else {
- if (//登录失败) {
- fireLoginError(Messages.getString("Session.loginFailed"));
- } else {
- session.setAuthenticated(true);
- fireLoginComplete();
- //处理登录动作
- }
- }
- return session.isAuthenticated();
- }
- }
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方法就可以了。
细节就不描述了,下面是一些个人认为比较关键的代码片段:
- /*
- * 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的实现类:
- 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()方法已经被废弃,但是暂时没想到什么方法来中止
- //就暂时这样子用了,还请大家指教!
- 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);
- }
- });
- }
评论
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>
<p>你可以试一下在自己的ApplicationWorkbenchAdvisor里重写openwindows。</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;
}
}
定一个中断标志的成员变量,然后在运行中检查这个标志,
如果为真则退出循环之类的。
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;
}
}
发表评论
-
使用Sleak分析RCP应用潜在内存泄露
2008-02-14 16:14 18541. following the website(http:/ ... -
一个RCP的IM应用,请教关于网络故障及恢复的处理方法
2007-04-02 16:15 2799目前是一个IM系统,需要在网络连接断开的时候,关掉主程序,回到 ... -
关于Dispose SWT资源的思考与疑问
2007-03-19 14:10 2287我们知道,在SWT中,有两条关于Dispose的法则: 1。 ... -
使用Ant,Maven构建Eclipse RCP Product
2007-03-06 19:55 5227通常我们打包Product的时 ... -
在Eclipse RCP中实现I18N的思考与疑问
2007-02-14 17:11 3752在RCP产品中实现国际化,一般是两种方式。 方式一: ... -
Eclipse RCP开发书籍资料简介
2007-01-22 11:31 7953为了给大家提供方便,我在这篇帖子里对常用的RCP参考资料作了一 ... -
RCP中异步线程的处理
2007-01-17 17:13 6050在RCP中要在非UI线程中执行UI线程的操作,最简单的方式就是 ... -
UI的底层机制
2006-09-18 14:54 1765EventHandler要抽象出一个接口来,然后根据不同的需要 ... -
有关CellEditor
2006-09-18 15:08 3489为了批量发布设备,需要在一个窗口中为设备命名,设定其类型等,要 ... -
SWT基础概念之一
2006-09-18 15:09 1512Design decisions: Most platfo ... -
Dialog相关
2006-09-18 15:09 1732ModalessDialog: public class M ... -
使用JFace Viewer注意事项
2006-09-21 14:44 1813如果使用了Eclipse3.2提供的自绘制功能来在table或 ... -
设置Perspective
2006-10-08 10:04 2452在IWorkbenchPreferenceConstants中 ... -
用RCP做出漂亮的对话框
2006-10-16 18:11 5310首先是一个效果图: 为了不违反保密协议,偶在这里把log ... -
指定JFace.Dialog初始化的位置
2006-11-08 15:23 3504目的1:打开一个新的对 ... -
使SWT的Table根据TableItem显示Tooltip
2006-12-11 19:13 3700默认情况下,SWT的Table只 ... -
动态改变RCP应用程序的标题
2006-12-13 18:47 2610我们知道,Title是在ApplicationWorkbenc ... -
ViewerFilter与自定义选中Column的颜色
2006-12-26 16:10 2835ViewerFilter主要用于根据 ...
相关推荐
RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体
rcpmail是基于Eclipse RCP构建的一个邮件管理客户端,它展示了如何利用RCP框架开发出具有用户友好的界面和高效功能的应用程序。 首先,我们来理解Eclipse RCP的核心概念。RCP是Eclipse IDE的基础,它提供了构建可...
在RCP应用程序中,欢迎界面通常是通过intro扩展点来实现的。 intro扩展点 intro扩展点是RCP应用程序中的一种扩展点,用于定义欢迎界面的内容和行为。intro扩展点由三个部分组成:intro、config和configExtension。...
在开发Java RCP(Rich Client Platform)应用程序时,有时需要对默认的...通过以上步骤,我们可以对RCP应用程序的窗口属性进行深度定制,提供更符合用户需求的界面体验。记住,持续优化和改进是提升用户体验的关键。
RCP提供了一个灵活的基础平台,允许开发者利用插件系统来扩展应用程序的功能,而无需从头开始编写整个用户界面。通过RCP,开发者可以专注于业务逻辑,而UI组件和框架已经由RCP提供,大大提高了开发效率。 **RCP核心...
在本项目中,“RCP实现ATM机器原码”指的是使用RCP协议开发的ATM机软件的源代码。 RCP(Remote Communication Protocol)是一种用于设备间通信的协议,特别是在分布式系统中,如ATM网络。它定义了数据传输的格式、...
RCP界面布局实例着重于如何在RCP应用程序中有效地组织和管理用户界面元素,使得用户能够高效地与应用进行交互。本文将深入探讨RCP界面布局的相关知识点,并基于提供的"com.rcp.steve.crm"这一文件名,我们可以推测这...
《基于Eclipse RCP Email客户端的实现》这篇本科毕业设计论文详细探讨了如何利用Java语言,结合Eclipse插件开发技术、RCP(Rich Client Platform)、EMF(Eclipse Modeling Framework)以及Java Mail工具包来构建一个...
本文将深入探讨如何在基于Eclipse RCP(Rich Client Platform)的应用中,利用适配器模式实现自定义的属性视图。Eclipse RCP是一个强大的框架,用于构建桌面应用程序,而属性视图则是展示对象属性的一种可视化组件。...
### 实现RCP在线升级说明 #### 一、前言 本文将详细介绍如何实现RCP(Rich Client Platform)客户端的在线升级功能。RCP是一种基于Eclipse框架的应用程序开发技术,它允许开发者构建功能丰富的桌面应用程序。随着...
本教程将深入探讨如何在Eclipse RCP程序中实现ViewPart的占位功能,这对于构建具有多视图的工作环境至关重要。 首先,我们需要理解ViewPart的基本概念。在Eclipse RCP中,ViewPart是用户界面中的一个组件,它通常...
Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许...Eclipse RCP的应用程序继承了Eclipse的风格与功能,通过RCP构建的应用程序可以脱离Eclipse环境独立运行,这对于开发Java桌面应用程序具有重要的意义。
【用RCP构建GEF程序】的PPT教程主要涵盖了Eclipse Rich Client Platform (RCP)和Graphical Editing Framework (GEF)的应用。Eclipse RCP是一个强大的开发平台,广泛应用于构建桌面应用程序,如GIS系统、高级项目管理...
### 定制SWT RCP界面—如何编写一个漂亮的SWT RCP界面 #### 引言 在现代软件开发中,用户界面(UI)的设计至关重要。一个美观且易用的界面不仅能提升用户体验,还能增强软件的整体竞争力。SWT (Standard Widget ...
在本文中,我们将深入探讨如何使用Eclipse RCP(Rich Client Platform)实现文本内容的对比功能。Eclipse RCP是一个强大的开发框架,它允许开发者构建桌面应用,而文本内容对比则是许多开发工具中的一个基本特性,...
《基于RCP实现图书销售管理系统》 图书销售管理系统是一个典型的业务信息系统,它的核心目标是有效管理图书库存,跟踪销售情况,以及提供用户友好的界面进行数据查询和操作。本系统采用RCP(Rich Client Platform)...
RCP的核心理念是将应用程序的界面、业务逻辑和数据管理分离,从而实现模块化、组件化的开发。 在"RCP 开发实例 源码"中,我们可以看到一个没有涉及数据库连接的纯界面应用示例。这样的例子通常会聚焦于UI设计和事件...
1.2. Eclipse RCP 构建风格 RCP 应用的基础是插件(Plugin),它们提供具体的功能;扩展点(Extension Point)则定义了插件可以插入的地方,允许其他插件进行扩展;而扩展(Extension)则是插件实际实现扩展点的过程...
在Eclipse RCP(Rich Client Platform)开发中,适配器(Adapter)机制是一个核心概念,它使得组件之间能够解耦合,实现灵活的交互。本文将深入探讨如何在RCP应用中通过适配器实现属性视图(Property View),以展示...
3. **布局和界面**:RCP允许开发者自定义窗口布局,创建和管理视图,以及添加自定义的操作和事件处理。 通过以上步骤和组件,开发者可以构建出具有高度定制化界面和功能的桌面应用程序。RCP的强大在于其灵活性和可...