addDomHandler和implements处理程序之间的区别

时间:2014-04-04 10:53:08

标签: java gwt event-handling

我正在创建一个能够从系统中拖放文件的复合面板。 它看起来像吼叫

public abstract class Upload extends Composite implements DragEnterHandler, DragLeaveHandler, DropHandler, DragOverHandler {
...

    @Override
    public void onDragOver(DragOverEvent event) {
        // TODO Auto-generated method stub
    }

它根本不起作用。但是"几乎"相同的代码

    initWidget(uiBinder.createAndBindUi(this));
    ...
    addDomHandler(new DragOverHandler() {
        @Override
        public void onDragOver(DragOverEvent event) {
            // TODO Auto-generated method stub
        }
    }, DragOverEvent.getType());

效果很好。

问题:

区别在哪里? Here我读到应该没有区别。 是否仍有可能在"接口实现"方式是什么?

2 个答案:

答案 0 :(得分:1)

仅仅因为你implement界面,并不意味着你的实现被使用了。

让我举个例子:

public class FancyButton extends Button implements SomeFancyButtonListener
{
    public FancyButton()
    {
        // This line is necessary, otherwise the implemented code isn't used.
        this.addFancyButtonListener(this);
    }

    @Override
    public void fancyButtonClicked(FancyClickEvent e)
    {
        // Do something
    }
}

相当于:

public class FancyButton extends Button
{
    public FancyButton()
    {
        this.addFancyButtonListener(new SomeFancyButtonListener()
        {
            @Override
            public void fancyButtonClicked(FancyClickEvent e)
            {
                // Do something
            }
        });
    }
}

从我在您的第一个代码段中看到的内容,您并未将this添加为Handler

答案 1 :(得分:0)

  

处理程序除非在组件上添加简单,否则不会工作。

在第一种情况下,您已经覆盖了处理程序的方法,但是您还没有在组件本身上添加此处理程序,但在第二种情况下,您已将其添加到组件及其实现中,这就是为什么它的原因工作


  

处理程序就像听众一样,工作方式与观察者模式相同。

如果组件想要侦听特定事件,则必须注册它。只要在系统中触发该事件,就会通知所有已注册的组件。