2011-11-09 24 views
1

我意识到运行menuItem中显示的命令的web应用程序。这些命令可能相互依赖,例如,如果命令C依赖于B,则B依赖于A来执行C,我们必须按照A-> B-> C的顺序执行。总之,我想改进对我的反馈应用程序并在鼠标悬停在依赖于它们的命令上时自动选择menuItem。 在此先感谢您的帮助。 注意:我使用GWT 2.3[GWT]是否可以选择menuItem onMouseOver?

回答

2

不幸的是,gwt提供的方法是不可能的。 MenuItemUiObject的直接子类,即继承自同一个超类Widget,但MenuItem不是Widget。问题是所有的事件函数都是在Widget中定义的,而不是在UiObject中定义的。

您可以尝试在自己的项目中创建类com.google.gwt.user.client.ui.MenuItem,从而“覆盖”gwt类,让它从Widget继承,将原始MenuItem复制到并实现必要的接口。虽然我不会推荐。我几乎为提到它而感到羞愧。 更优雅的解决方案是在您自己的包中创建一个MyMenuItem类。将MenuItem的内容复制到它,但让它从Widget继承。然后,在您的.gwt.xml中使用重新绑定规则来将MenuItem替换为MyMenuItem。只需记住在更改GWT版本时再次复制MenuItem。

或者,您可以重写MenuItem并添加您自己的事件处理函数。你可以看看Widget及其子类(TextField,Button ...)以了解如何完成该操作。开始的好地方是Widget#addDomHandler。它并不像听起来那么复杂 - 肮脏的工作隐藏在Widget类也使用的GWT类中。它主要是复制/粘贴。缺点是如果你想使用新的GWT版本并且需要重写,你的类可能不再工作了。

就我个人而言,我不会实现这样的选择作为即时鼠标悬停效果。这对新用户来说听起来不错,但作为一个有经验的用户,我会很烦恼。通常情况下,菜单项被分组在屏幕上,所以当我想要一个特定的菜单项时,大部分时间我都必须对其他项进行鼠标悬停。导致闪烁的菜单项 - 烦人,特别是当我已经做了这么多次,并知道命令的依赖关系。我可以推荐将它与一个计时器结合起来,以便在一定时间后选择依赖关系,例如500毫秒。有经验的用户点击的速度足够快,不会被打扰,新用户可以 - 如果需要的话 - 等一下,以获得额外的帮助。

哦,如果你真的想这样做 - mouseover是不够的。你也必须倾听焦点事件 - 许多用户使用他们的键盘进行导航,而不是通过鼠标悬停捕捉,但引发焦点事件。

2

我只是有同样的问题,这里是一个解决这个恼人的问题。 当您查看MenuBar类时,可以看到MenuBar中的每个MenuItem都处理了事件。 做的唯一一件事就是覆盖菜单栏的public void onBrowserEvent(Event event)方法,并找到至极项接收事件:

menu = new MenuBar(true) { 
     @Override 
     public void onBrowserEvent(Event event) { 
      MenuItem currentItem = null; 
      for (MenuItem item : itemList) { 
       if (DOM.isOrHasChild(item.getElement(), DOM.eventGetTarget(event))) { 
        //MenuItem found here 
        currentItem = item; 
       } 
      } 
      switch (DOM.eventGetType(event)) { 
      case Event.ONMOUSEOVER: 
       if (currentItem != null) { 
        // DO WHAT YOU GOTTA DO HERE 
       } 
       break;    
      } 
      super.onBrowserEvent(event); 
     } 
    }; 

您还可以创建自定义菜单项在其绑定的其他信息。

1

与前一个相比,这是一个更简单的解决方案 - 只需在MenuBarDocs)上使用setAutoOpen(true)方法即可。然后当用户将鼠标移到它们上面时,所有的子菜单都会打开。