使窗口的行为类似于gwt中的messagebox

时间:2018-03-13 19:22:40

标签: java gwt

所以我有一个函数,如果发生了什么事我需要显示一个带有表单和一些字段的Window。我不希望其余的代码运行,直到我关闭窗口。完全像一个messageBox,但在一些其他东西里面有一个表单。据我所知,messageBox非常简单,这就是我使用窗口的原因。 但窗口没有回调方法或其他东西使其余的代码等待窗口关闭(隐藏)。 我可能有错误的方法。我愿意接受建议。我宁愿继续使用带有modal = true的窗口类。

1 个答案:

答案 0 :(得分:0)

我不知道这是否适用于您的情况,但这是我能够实现这一目标的方式。需要注意的是我可以完全控制表单提交中的服务器响应

首先,向您的页面公开一个可以从本机javascript调用的方法。

public native void exportFormSubmissionProcessComplete(MyPresenter cop)/*-{
        $wnd.formSubmissionProcessComplete = $entry(function(result) {
            cop.@com.client.package.MyPresenter::formSubmissionProcessComplete(Ljava/lang/String;)(result);
        });
    }-*/;

然后创建您刚刚导出的方法"作为JSNI

private void formSubmissionProcessComplete(String result){
  if(result != null){
    //Process the results from where ever you submitted your form
  }
}

接下来,您从表单提交中制作HTML响应以触发公开的JSNI方法。 (我使用的是一个java servlet,这就是我的例子)

//...Arbitrary servelet processing code
response.setContentType("text/html");
response.getWriter().print("<!DOCTYPE html><head><title>FormProcessComplete</title>");
Map<String, String> data = parseData(buffer.toString());
  if(data.get(RESULT).equals("0")){
    //SUCCESS
    response.getWriter().print("<script type=\"text/javascript\">window.parent.formSubmissionProcessComplete(\"SUCCESS|" + data.toString().trim() + "\");</script>");
  }else{
    //FAIL
    response.getWriter().print("<script type=\"text/javascript\">window.parent.formSubmissionProcessComplete(\"FAIL|" + data.toString().trim() + "\");</script>");
  }
  response.getWriter().print("</head><body></body></html>");
//...Arbitrary servelet processing code

最后一部分是将FormPanel窗口小部件抛出到Frame窗口小部件中,并将FormPanel的目标设置为将根据上面的示例生成HTML响应的服务器端点。然后获取Frame小部件并将其显示在DialogBox中。

public static void submitForm(String actionURL, String qryString, DialogBox formProcessingDialog) {
        Frame processFormWindow = new Frame();
        processCCWindow.setSize("1px", "1px");
        formProcessingDialog.setGlassEnabled(true);
        formProcessingDialog.setText("Processing Form");
        VerticalPanel panel = new VerticalPanel();
        FormPanel form = new FormPanel();
        //Do whatcha gotta do to make your form here
        panel.add(processFormWindow);
        panel.add(form);
        formProcessingDialog.setWidget(panel);
        formProcessingDialog.center();
        formProcessingDialog.show();
        processFormWindow.setUrl(actionURL + "?" + qryString);
    }

这不是100%即插即用,但希望它会让你朝着一个适合你的方向前进。