【问题标题】:GWT removeHandler on first event notification第一个事件通知上的 GWT removeHandler
【发布时间】:2010-04-10 18:05:27
【问题描述】:

我想在第一次收到事件时删除 GWT 事件处理程序。我还想避免跟踪不必要的注册对象污染我的班级。我目前将其编码为:

final HandlerRegistration[] registrationRef = new HandlerRegistration[1];
registrationRef[0] = dialog.addFooHandler(new FooHandler()
{
    公共无效 onFoo(FooEvent 事件)
    {
        HandlerRegistration removeMe = registrationRef[0];
        如果(删除我!= null)
        {
            removeMe.removeHandler();
        }

        // 在这里做事
    }
});

但是registrationRef的使用降低了代码的可读性。有没有更好的方法可以在不向我的类中添加变量的情况下做到这一点?

【问题讨论】:

    标签: java events gwt event-handling


    【解决方案1】:

    我只是将 HandlerRegistration 对象设为封闭类的字段,这样您就不会被编译器打扰,而且它比洗牌数组和其他东西更“优雅”:

    public class TestWidget extends Composite {
        //...
    
        HandlerRegistration handler;
    
        public TestWidget() {
            // ...
    
            handler = button.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    // ...
                    handler.removeHandler();                
                }
            });
        }
    
    }
    

    【讨论】:

    • 好的,谢谢。我想这是当你在一个类中只有一个这样的听众时要走的路(但当你有任意数量的小部件时,事情会变得更加混乱)。我希望有一种方法可以在不添加新字段的情况下做到这一点。哦,好吧...
    • 这可能不像看起来那么简单。我有处理程序在 onXXX() 方法中设置为 null 的情况。为什么?因为没有什么可以阻止 GWT 立即调用处理程序。例如,在 Image.onLoad() 中的 IE 案例中,如果图像已经加载,它可以在 addLoadHandler() 调用期间实际调用处理程序。我发现在这种情况下,唯一的解决方法是包装“if null”检查,然后再进行清理。
    • 如果可以多次添加处理程序,这将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多