RMI与Dialog模态框的综合应用(附系统活动图)

需求分析:
之前我们已经实现了RMI,由于在现实应该场合之中,很多情况下,我们希望用户不要随意点击某些特殊按钮,造成对服务器的频繁请求,为此我们想到设计模态框,使用模态框。

我们给出 具体的活动图

具体实现
其中我们想到在应用RMI的时候,若是用户点击登录按钮,将会给服务器端发送
Login这个方法,并传过去ID 和pssword 这时候 还没有返回结果的时候,我们就可以进行模态框的显示,使得用户不能再点击,当返回结果之后,模态框就可以关闭了

我们进一步分析可以得到:
当发生类似 登录这种需要同步事件时都应该进行模态框的生成
因此可以给一个关于模态框的注解 给特定的接口(里面有类似登录事件的方法)
进行注解:

@Retention(RUNTIME)
@Target(METHOD)
public @interface ModelDialog {
	String caption();
}


然后再Client的应该怎加一个getProxy方法
里面是双参 不光有interface 还要有 parent窗体
在拦截方法里面判断 是不是有特定注解
若有则生成一个 模态框

public <T> T getProxy(Class<?> interfaces, JFrame parent) {
		return (T) Proxy.newProxyInstance(
				interfaces.getClassLoader(), 
				new Class<?>[] {interfaces}, 
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						Object result = null;
						
						rmiClient.setMethod(method);
						rmiClient.setArgs(args);
						
						if (method.isAnnotationPresent(ModelDialog.class)) {
							ModelDialog modelDialog = method.getAnnotation(ModelDialog.class);
							String caption = modelDialog.caption();
							
							MecDialog dialog = new MecDialog(parent, true);
							dialog.setRmiClient(rmiClient);
							dialog.setCaption(caption);
							dialog.showDialog();
							
							result = dialog.getResult();
						} else {
							result = rmiClient.invokeMethod();
						}
						checkResult(method, result);
						
						return result;
					}
				});
	}




写到这一步的时候,我有点掉以轻心了
尝试运行 程序 卡到模态框不往下执行
并且我们知道

*ShowDialog():调用的form会返回一个DialogResult(窗体显示为模式窗体)单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel
在使用.ShowDialog()后,主程序会暂停,等待form被Close()后返回一个值,然后再继续执行form.ShowDialog()后面的语句。

*
奇思妙想
所以还不能给ShowDialog()方法写任何代码进行错误修正 因为根本没有用
我们想到利用 Dialog 出现之后 获取焦点 然后 侦听 服务器端传来结果(结果还要最终还要传到ClientProxy里面)
再进行模态框的关闭

private void dealAction() {
		addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
                            //等侦听到dialog显示后便执行该方法
				result = rmiClient.RMIsend();
				//得到结果后关闭掉模态框
				dispose();
			}
		});
	}

这样我们就成功啦!

全部评论

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务