2014-04-04 50 views
0

我正在创建一个能够从系统中拖放文件的复合面板。 它看起来像波纹管addDomHandler和implements handler之间的区别

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我读过,应该没有区别。 还有可能在“界面工具”中使用它吗?

回答

1

仅仅因为你的接口,并不意味着你的实现被使用了。

让我给你举个例子:

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

从我可以在你的第一个代码段看,你是不是添加thisHandler

0

处理程序不工作,直到一个除非它被添加到组件上就像它是简单的。

在第一种情况下,你已经覆盖了处理程序的方法,但你还没有加入该处理器基于组件本身,而在第二种情况下,你已经与它一起实现它添加组件上,这就是为什么它的工作。


处理程序就像在相同的方式Observer模式工程工作的听众。

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