[英]How can I access a GWT menubar popup panel / submenu?
我正在尝试将一些鼠标监听器添加到GWT的MenuBar的子菜单/级联菜单中。 可悲的是,我似乎无法直接访问子菜单popuppanel - 这样做的方法(getPopup())是私有的。 由于GWT编译的方式,你无法通过反射访问它。
将鼠标监听器添加到主菜单栏(以检测鼠标何时位于菜单栏边界内)非常简单。 但我无法想办法添加一个鼠标监听器来告诉鼠标何时进入其中一个级联子菜单。
我在做什么是这样的:
com.google.gwt.user.client.ui.MenuBar myMainBar = new MenuBar();
myMainBar.addDomHandler(menuHoverOutHandler, MouseOutEvent.getType());
myMainBar.addDomHandler(menuHoverOverHandler, MouseOverEvent.getType());
这适用于实际的GWT MenuBar。 当我鼠标进入时,mouseOverEvent会触发。 当我鼠标移出时,MouseOutEvent会触发。
问题是如果我从主菜单栏打开一个子菜单,鼠标进入该菜单也会触发MouseOutEvent。 我不需要那样做。
当我说子菜单时,我的意思是这里看到的东西:
http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/MenuBar.html
因此,只要我在列出Style,Fruit和Term的'main'栏中,鼠标事件就会识别出来。
但是,如果我下到菜单上显示Bold,Italicized,More,那么鼠标事件就相信我完全离开了菜单栏。 我需要一种方法来确定鼠标是否位于其中一个子菜单中。 (或者这个主菜单栏的子菜单在某处打开)
你不能简单地做
myMainBar.getPopup()
并将侦听器添加到生成的PopupPanel中,因为getPopup是私有的。 我正在寻找另一种方法来获取MenuBar.popup
似乎没有方法可以判断其中一个子菜单是否打开,这对我来说有点令人困惑。 似乎有一种令人沮丧的缺乏与这些子菜单交互的能力,我想知道我是否遗漏了一些东西。
如果将MouseOverHandler
和MouseOutHandler
添加到每个子菜单而不是主菜单栏,它应该可以执行您想要的操作。
例如:
MenuBar subMenu = new MenuBar(true);
subMenu.addItem("Item1", new Command() {
@Override
public void execute() {
Window.alert("Item1 clicked");
}
});
subMenu.addDomHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent arg0) {
Window.alert("SubMenu over!");
}
}, MouseOverEvent.getType());
subMenu.addDomHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent arg0) {
Window.alert("SubMenu out!");
}
}, MouseOutEvent.getType());
MenuBar mainMenu = new MenuBar();
mainMenu.addItem("SubMenu", subMenu);
RootPanel.get().add(mainMenu);
您的问题与其自身的事件逻辑有关:您希望有一种新类型的事件,只有当鼠标移出菜单时才会触发,而如果它在菜单之间移动则不会触发。
要做到这一点,您可以添加侦听mouve和mouse out的代码,并编译可用信息以了解发生的情况。
您可以确保在使用调度程序传递所有事件后执行代码
Scheduler.get().scheduleDeferred(new Command() {
public void execute () {
//check all what happened in a static shared variable, there was a mouse out, was there a mouse over after it? if yes then stay calm; If there wasn't, then trigger a MouseOutOfAllMenus event
}
});
此代码段应放在onMouseOut()
,另一个只更新静态类实例状态的代码应放在onMouseOver()
。 由于Scheduling延迟机制,您可以确保在执行onMouseOver()
之后, Scheduler.execute()
的代码将执行。 所以当你来检查状态时,它会在鼠标进入另一个菜单后(或没有); 因此,您可以知道用户是否真的离开了菜单项,或者他是否已进入子菜单。
最后推荐:在单独的类中执行此代码,以便您可以将此丰富菜单作为组件提供以供将来使用。 另外请记住,通过保持独立性,您可以更轻松地测试和运行自动化测试场景。
我希望你理解我试图解释的所有内容,如果没有,请随意发表评论,我会尽力回答你
最好的祝福,
ps:当我说一个静态实例状态时,它只是为了便于理解。 当然建议避免静态使用,以便在同一个应用程序中有多个菜单。 静态我的意思是:所有组件都可以访问的实例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.