从GWT中的内部面板传播事件

从GWT中的内部面板传播事件,gwt,mouseover,gwt2,Gwt,Mouseover,Gwt2,我创建了一个组件,它是一个复合面板(我们称之为A),在其他几个复合面板(B1、B2、B3)的内部,每个内部复合面板(B1、B2、B3)都会自动点火 OnMouseOver,这没问题(我知道如何将事件添加到复合面板) 问题: 但如何将此事件传播到主要复合面板(A)。 我想在某些视图中使用panelA,如下所示: @UiField MyCompositePanelA panelA; //which has inside B1 B2 B3 ... ... @UiHandler(value={"pa

我创建了一个组件,它是一个复合面板(我们称之为A),在其他几个复合面板(B1B2B3)的内部,每个内部复合面板(B1B2B3)都会自动点火 OnMouseOver,这没问题(我知道如何将事件添加到复合面板)
问题:
但如何将此事件传播到主要复合面板(A)。 我想在某些视图中使用panelA,如下所示:

@UiField
MyCompositePanelA panelA; //which has inside B1 B2 B3 ...

...

@UiHandler(value={"panelA"})
void onOver(MouseOverEvent e) { //or some other custom event

    if (e... =  B1) // recognize - was MouseOverEvent on B1 
}

致以最诚挚的问候

您有两种选择:EventBus,这在您的用例中很可能是一种过度使用,或者将处理程序附加到您的内部面板。比如说,

(a) 将此方法添加到内部面板小部件:

public void addMyMouseOverHandler(MouseOverHandler mouseOverHandler) {
    myInternalPanel.addDomHandler(mouseOverHandler, MouseOverEvent.getType());
}
(b) 然后,创建此处理程序:

MouseOverHandler mouseOverHandler = new MouseOverHandler() {

    @Override
    public void onMouseOver(MouseOverEvent event) {
        // do something when this event fires
    }
}
并将其附着到您创建的每个内部面板

如果所需操作超出小部件的范围,则无法使用Ui:Binder附加此处理程序。您需要创建这个处理程序,其中包含完成操作所需的所有内容(如在视图中),然后将其附加到小部件


换句话说,在GWT中,您不必等待事件传播到所需的级别(比如视图):您在处理程序中指定所需的操作,然后将该处理程序附加到小部件

谢谢你的回答,但我仍然不知道,如何才能把这件事考虑进去。我想到的一件事是,我可以将MouseOverHandler的对象作为命令设计模式从视图传递到组件。或者还有其他方法?你可以使用任何你喜欢的设计模式。您可以创建一个小部件并在同一个位置向其附加处理程序,也可以在一个位置创建处理程序,在另一个位置创建小部件并传递处理程序。