【发布时间】: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