gpt4 book ai didi

java - 以编程方式调用 button.click() 后,GWT FileUpload form.submit() 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:56 24 4
gpt4 key购买 nike

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

不幸的是,我必须从 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 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);
}
}

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

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

最佳答案

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

关于java - 以编程方式调用 button.click() 后,GWT FileUpload form.submit() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com