我实现了一个运行menuItem中显示的命令的Web应用程序。这些命令可以相互依赖,例如,如果命令C依赖于B,则B依赖于A来执行C,我们必须按顺序执行A-> B-> C.简而言之,我想改进对我的应用程序的反馈,并在鼠标悬停在依赖于它们的命令上时自动选择menuItems。 在此先感谢您的帮助。 注意:我使用GWT 2.3
答案 0 :(得分:2)
不幸的是,使用gwt提供的方法是不可能的。 MenuItem
是UiObject
的直接子类,这是继承自的同一个超类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
。它并不像听起来那么复杂 - 脏工作隐藏在GWT的DOM
类中,Widget类也使用它。它主要是复制/粘贴。缺点是,如果您想使用新的GWT版本并且需要重写,您的类可能不再起作用。
就个人而言,我不会将这样的选择实现为即时鼠标悬停效果。这对新用户来说听起来不错,但作为一名经验丰富的用户,我会很生气。通常,菜单项在屏幕上分组,所以当我想要一个特定的菜单项时,大多数时候我也必须鼠标悬停其他项。导致闪烁的菜单项 - 很烦人,特别是当我已经这样做了一百次并且知道命令的依赖性时。我是否可以建议将其与计时器相结合,以便在一定时间后选择依赖关系,例如500毫秒?有经验的用户点击足够快,不会被它打扰,新用户可以 - 如果需要 - 稍等一下,以获得额外的帮助。
哦,如果你真的想这样做 - 鼠标悬停是不够的。你也必须听焦点事件 - 许多用户使用他们的键盘进行导航,这不会被鼠标悬停捕获,但会引发焦点事件。
答案 1 :(得分:2)
我刚才遇到了同样的问题,这是解决这个烦人问题的方法。
当您查看MenuBar
类时,您可以看到为MenuBar中的每个MenuItem处理事件。
唯一要做的就是覆盖MenuBar的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);
}
};
您还可以创建自定义MenuItem以绑定其中的其他信息。
答案 2 :(得分:1)
与前一个相比,这是一个更简单的解决方案 - 只需在setAutoOpen(true)
(Docs)上使用MenuBar
方法。然后,当用户将鼠标移到它们上面时,所有子菜单都将打开。