我正在创建一个复合面板,该面板能够从系统中拖放文件。它看起来像波纹管
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());
效果很好。
问题:
区别在哪里?在这里我读到应该没有区别。是否还有可能以"接口实现"的方式使用它?
仅仅因为你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
。
处理程序在 a 之前不起作用,除非它像它一样简单地添加到组件上。
在第一种情况下,您已经覆盖了处理程序的方法,但您尚未在组件本身上添加此处理程序,但在第二种情况下,您已将其及其实现添加到组件上,这就是它工作的原因。
处理程序就像侦听器一样,其工作方式与观察者模式的工作方式相同。
如果组件想要侦听特定事件,则必须注册该事件。每当在系统中触发该事件时,都会通知所有已注册的组件。