需求分析:
之前我们已经实现了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();
}
});
}
这样我们就成功啦!