【问题标题】:GWT FileUpload form.submit() doesn't work after calling the button.click() programmatically以编程方式调用 button.click() 后 GWT FileUpload form.submit() 不起作用
【发布时间】:2015-04-11 16:46:41
【问题描述】:

我正在编写一个在 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() 方法后,点击事件被触发,但表单没有提交(只是没有任何反应)。这两种触发点击事件的方法之间有什么区别吗?

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

编辑

根据@Pedro Pedrozzi 的回答,我已经实现了一个事件:

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);
    }  
}

在一个小部件类(实现上面的接口)中添加:

@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();
        }   
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我对代码进行了一些修改,但它仍然不起作用 - 触发了事件,但没有像以前那样提交表单。
    • 是否调用了您的事件处理程序?您应该分享更多代码以获得更多帮助。
    • 我刚刚阅读了您的问题编辑。您必须使用 FormToSubmitEvent.register() 注册实现 FormToSubmitEventHandler 的类
    • 哦,对不起,我忘记了 - 类正在注册,事件处理程序也正在被调用。用另一个 EDIT 更新了更改。
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多