以编程方式调用button.click()后,GWT FileUpload form.submit()无法正常工作

时间:2015-02-11 10:42:14

标签: java gwt file-upload onclick form-submit

我正在编写一个简单的解决方案,用于在GWT中上传文件,最近遇到了一个很小但很烦人的问题。我在FormPanel中使用标准的GWT FileUpload小部件。只有当用户点击“物理”一个与表单相关的按钮时,一切正常(表单被提交并且文件被发送到servlet),附带一个单击处理程序(内部有form.submit()被触发)。

不幸的是,我必须在FormPanel的父窗口小部件(另一个类)中从另一个地方提交表单。我尝试使用此特定代码和Visible属性设置为“false”的按钮实现点击模拟:

public void buttonClick() 
{
    NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
    DomEvent.fireNativeEvent(event, saveFileBtn);
}

saveFileBtn.addClickHandler(new ClickHandler()
{

    @Override
    public void onClick(ClickEvent event)
    {
        if(fileUpload.getFilename().isEmpty())
            return;
        else {
            form.submit();
        }           
    }
});

调用buttonClick()方法后,会触发click事件,但表单不会提交(只是没有任何反应)。触发点击事件的这两种方法之间是否有任何差异?

如果是这样,那么最好的替代方法是什么呢?我想让自己的小部件执行与标准GWT FormPanel类似的操作,但是以base64格式编码文件并使用RequestBuilder机制发送到服务器。它有意义吗?

修改

根据@ Pedro Pedruzzi的回答,我已经实施了一个活动:

public interface FormToSubmitEventHandler extends EventHandler {
   void onFormToSubmit(FormToSubmitEvent event);
}

public class FormToSubmitEvent extends GwtEvent<FormToSubmitEventHandler> {

    public static final Type<FormToSubmitEventHandler> TYPE = new Type<FormToSubmitEventHandler>();

    public FormToSubmitEvent() {
        super();
    }

    @Override
    public Type<FormToSubmitEventHandler> getAssociatedType()
    {
        return TYPE;
    }

    @Override
    protected void dispatch(FormToSubmitEventHandler handler)
    {
        handler.onFormToSubmit(this);
    }

    public static HandlerRegistration register(EventBus eventBus, FormToSubmitEventHandler handler) 
    {
        return eventBus.addHandler(TYPE, handler);
    }  
}

在widget类(实现上面的接口)中添加:

@Override
public void onFormToSubmit(FormToSubmitEvent event)
{
    if(fileUpload.getFilename().isEmpty())
        return;
    else {          
        form.submit();
    }   
}   

然后:

FormToSubmitEvent event = new FormToSubmitEvent();
Events.getTactinEventBus().fireEvent(event);

不幸的是 - 它仍然不起作用。我对发生的事情感到很困惑。

编辑2

带有注册处理程序的全班:

public class FileLinkPropertyControl implements FormToSubmitEventHandler
{
    private FileUpload fileUpload;
    protected FormPanel form;;
    protected HorizontalPanel hPanel;   

    public FileLinkPropertyControl() {

    fileUpload = new FileUpload();

    FormToSubmitEvent.register(Events.getTactinEventBus(), this);

    fileUpload.setName("fileUploadFormElement");
    fileUpload.addChangeHandler(new ChangeHandler()
    {

        @Override
        public void onChange(ChangeEvent event)
        {
            setValue(fileUpload.getFilename(), true);                       
        }
    });

    form.setEncoding(FormPanel.ENCODING_MULTIPART);
    form.setMethod(FormPanel.METHOD_POST);
    form.setAction(GWT.getModuleBaseURL() + "fileUploadServlet");
    form.setWidget(hPanel);
    hPanel.add(fileUpload);
    }

    @Override
    public void onFormToSubmit(FormToSubmitEvent event)
    {
        if(fileUpload.getFilename().isEmpty())
            return;
        else {
            form.submit();
        }   
    }
}

1 个答案:

答案 0 :(得分:0)

请勿尝试模拟点击或手动发出请求。你必须以某种方式达到form.submit()。如果窗口小部件层次结构过于复杂而无法使用简单的调用链方法,则应使用事件(请参阅http://www.gwtproject.org/doc/latest/DevGuideUiHandlers.html)。