- 浏览: 339078 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 18191. following the website(http:/ ... -
一个RCP的IM应用,请教关于网络故障及恢复的处理方法
2007-04-02 16:15 2750目前是一个IM系统,需要在网络连接断开的时候,关掉主程序,回到 ... -
关于Dispose SWT资源的思考与疑问
2007-03-19 14:10 2252我们知道,在SWT中,有两条关于Dispose的法则: 1。 ... -
使用Ant,Maven构建Eclipse RCP Product
2007-03-06 19:55 5181通常我们打包Product的时 ... -
在Eclipse RCP中实现I18N的思考与疑问
2007-02-14 17:11 3724在RCP产品中实现国际化,一般是两种方式。 方式一: ... -
Eclipse RCP开发书籍资料简介
2007-01-22 11:31 7905为了给大家提供方便,我在这篇帖子里对常用的RCP参考资料作了一 ... -
RCP中异步线程的处理
2007-01-17 17:13 6009在RCP中要在非UI线程中执行UI线程的操作,最简单的方式就是 ... -
UI的底层机制
2006-09-18 14:54 1747EventHandler要抽象出一个接口来,然后根据不同的需要 ... -
有关CellEditor
2006-09-18 15:08 3453为了批量发布设备,需要在一个窗口中为设备命名,设定其类型等,要 ... -
SWT基础概念之一
2006-09-18 15:09 1485Design decisions: Most platfo ... -
Dialog相关
2006-09-18 15:09 1702ModalessDialog: public class M ... -
使用JFace Viewer注意事项
2006-09-21 14:44 1787如果使用了Eclipse3.2提供的自绘制功能来在table或 ... -
设置Perspective
2006-10-08 10:04 2416在IWorkbenchPreferenceConstants中 ... -
用RCP做出漂亮的对话框
2006-10-16 18:11 5276首先是一个效果图: 为了不违反保密协议,偶在这里把log ... -
指定JFace.Dialog初始化的位置
2006-11-08 15:23 3478目的1:打开一个新的对 ... -
使SWT的Table根据TableItem显示Tooltip
2006-12-11 19:13 3667默认情况下,SWT的Table只 ... -
动态改变RCP应用程序的标题
2006-12-13 18:47 2576我们知道,Title是在ApplicationWorkbenc ... -
ViewerFilter与自定义选中Column的颜色
2006-12-26 16:10 2809ViewerFilter主要用于根据 ...
相关推荐
Eclipse rcp 实现文本内容对比功能,可自己选取对比的文件进行比较
RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体RCP项目的登录窗体
RCP 实现ATM机器原码
这就是对RCP实现在线升级的说明,实现导出RCP查品,制作升级网站。
基于RCP实现图书销售管理系统
RCP&OSGI;
基于适配器模式的RCP应用属性视图实现,在做RCP或者Eclipse插件开发的朋友可以用到的,关于如何自定义属性栏信息
转载的,rcp欢迎界面设计,欢迎大家一起用
向导生成的应用程序主界面并不能满足要求,存在很多问题,例如,主界面运行时没有自动居中,主界面大小没有固定,主窗口标题栏文字应该是“高校经费测算系统”。再看看图5-3、图5-4的标题栏有区别没有?当然有,图5-...
本文通过使用java语言,基于Eclipse Plug-ins,RCP,EMF等技术,及java mail工具包实现了Email客户端,并通过此系统的实现来加深对Eclipse插件开发技术的学习。本系统适用于所有用户,无管理员设置,可以创建多个网络...
RCP在线升级RCP在线升级RCP在线升级RCP在线升级RCP在线升级
一个用RCP实现的CRM例子,包括源码。
RCP 界面布局实例 主要描述视图布局
基于eclipse RCP实现的邮件管理客户端,是一个比较完整的eclipse RCP例子,国内少有的资源,比较适合想学习eclipse RCP技术,而又不知道从何下手的网友。
RCP实现的带有复选框的TreeViewer,选择相关行,能够提示用户相关信息
Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...
clipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作 ...
RCP 开发实例,纯界面,没有连接数据库
SWT RCP 界面--如何编写一个漂亮的 SWT RCP 界面
程序的实现是在一个类里面,界面与处理完美分开。这样使得前台与后台分离,有更好的移植性。