GWT中的DOM元素处理程序

15

我想在按钮元素上添加处理程序,我已经按照下面的方式实现了它。请帮助我解决这段代码中的错误。我不想直接在按钮小部件上添加处理程序。

        Button button = new Button("Click");
        Element buttonElement = button.getElement();

        Event.setEventListener(buttonElement, new EventListener() {

            @Override
            public void onBrowserEvent(Event event) {

                String string = event.getType();

                if(string.equalsIgnoreCase("click")) {
                    System.out.println("CLICK");
                }
            }
        });

        Event.sinkEvents(buttonElement, Event.ONCLICK);
1个回答

23

你的代码是正确的,可能是在 sink 事件之后添加了 widget。你需要在 sink 事件之前添加 widget。举个例子:

Button  button=new Button("Click");
    Element buttonElement = button.getElement();
      RootPanel.get().add(button);
    Event.sinkEvents(buttonElement, Event.ONCLICK);
    Event.setEventListener(buttonElement, new EventListener() {

        @Override
        public void onBrowserEvent(Event event) {
            System.out.println("ok");
             if(Event.ONCLICK == event.getTypeInt()) {
                 Window.alert("ok");
                  System.out.println("CLICK");
             }

        }
    });

但是为什么我们需要在之后调用 sinkEvents 函数呢? - Mani
3
因为“Button”(以及大多数小部件)只有在有处理程序的情况下才会_sink_一个事件;这是通过“addDomHandler”自动完成的。在这里由于某种未知的原因,您不想添加“addClickHandler”,因此必须自己调用“sinkEvents”。顺便问一句,如果您不使用其事件,为什么要创建一个“Button”小部件呢?尝试使用“Document.get().createButtonElement()”怎么样? - Thomas Broyer
@ThomasBroyer,实际上我想让datagrid的行可拖动,因此我将行作为元素获取并希望在其上添加处理程序。[https://dev59.com/_nLYa4cB1Zd3GeqPTRIF#16538946?noredirect=1#16538946](线程) - Mani
@Mani 因为每个小部件都需要有一个单独的“根”元素。每当小部件被附加时,它会创建一个从元素到小部件的“后向引用”,即 elem.__listener = widget,在 DOM.setEventListener() 中执行。这是在小部件附加时设置的,并在分离时清除。 - bNd
1
@Bhumika:只有在您没有显式使用Event.setEventListener(它仅在元素级别而不是小部件级别工作,因此没有附加/分离的概念)时才会发生这种情况;sinkEvents也仅在小部件的第一个onAttach中调用。 - Thomas Broyer
好的,感谢您的纠正 :) 到目前为止,我认为“sink event”在附加/分离时都会被调用。 - bNd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接