Gwt 单击事件处理程序

Gwt 单击事件处理程序,gwt,event-handling,Gwt,Event Handling,当我点击一个按钮时,点击事件处理程序执行一个代码。如果由于错误(如果浏览器挂起),我点击按钮两次,代码就会执行两次。我不希望这种情况发生。 有什么建议可以阻止吗 我想我应该使用时间表或计时器,但我不确定 代码如下: public void onSendButtonClicked(){ 禁用按钮(); fireEvent(新的SendEmcsDeclarationEvent(getDeclaration(),getMsgType()); } 我能想到的最好方法是启用/禁用按钮本身,以确保在上一次调

当我点击一个按钮时,点击事件处理程序执行一个代码。如果由于错误(如果浏览器挂起),我点击按钮两次,代码就会执行两次。我不希望这种情况发生。 有什么建议可以阻止吗

我想我应该使用时间表或计时器,但我不确定

代码如下:

public void onSendButtonClicked(){
禁用按钮();
fireEvent(新的SendEmcsDeclarationEvent(getDeclaration(),getMsgType());
}

我能想到的最好方法是启用/禁用按钮本身,以确保在上一次调用结束之前不会再次调用处理程序中的代码

public void onSendButtonClicked()
{
    try
    {
        disableButtons();

        eventBus.fireEvent(new SendEmcsDeclarationEvent(getDeclaration(), getMsgType()));
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally 
    {
        enableButtons();
    }

}

正如Abdullah提到的,您可以使用

widget.setEnable(false)

widget.setEnable(true)

如果要锁定整个屏幕,请创建一个模式弹出窗口,在按下按钮后显示,并在代码完成后隐藏

public void onSendButtonClicked() {

    myProgessBar.show();

    eventBus.fireEvent(new SendEmcsDeclarationEvent(getDeclaration(), getMsgType()));

    myProgressBar.hide();
}
如果使用异步调用,则必须在回调中隐藏progessbar。在这种情况下,finally命令可能在执行回调之前执行。在您的情况下,最好创建ShowProgressBarEvent和HideProgressbarEvent,这样您就可以在整个应用程序中使用progressbar

如果您使用的是小部件库f.e.:GXT,您将发现一个可供使用的ProgressBar


希望有帮助。

当我创建一个按钮时,我总是添加一个动画gif(ajaxloader)

单击按钮时,我使按钮不可见,ajaxloader可见。 当操作完成时,我使ajaxloader不可见,按钮可见


通过这种方式,用户可以看到一些正在发生的事情的视觉反馈(当禁用按钮时,您没有得到),而不是整个应用程序被阻止(作为一个模态),这是使用ajax的优点之一。

@addullah我的应用程序中没有任何启用功能,也许我需要一个比这个@EL Hoss the disableButtons()更好的解决方案函数已禁用该按钮。SendEmcsDeclarationEvent函数基本上在某个位置发送Declaration,但在事件总线完成该事件之前,另一个事件开始,这导致使用相同数据发送两个Declaration。这是我们需要解决的问题。在何处/何时启用该按钮?如我的示例所示上面的代码,当单击发送按钮时,会调用onSendButtonClicked()函数,并在其中调用disableButtons(),这将禁用发送按钮和许多其他按钮,最后会发送删除。我认为您禁用了该按钮。如何再次单击按钮?如果应用程序挂起或internet速度较慢,则在禁用之前单击按钮