[GWT]是否可以选择menuItem onMouseOver?

时间:2011-11-09 23:48:21

标签: java javascript gwt java-ee gwt2

我实现了一个运行menuItem中显示的命令的Web应用程序。这些命令可以相互依赖,例如,如果命令C依赖于B,则B依赖于A来执行C,我们必须按顺序执行A-> B-> C.简而言之,我想改进对我的应用程序的反馈,并在鼠标悬停在依赖于它们的命令上时自动选择menuItems。 在此先感谢您的帮助。 注意:我使用GWT 2.3

3 个答案:

答案 0 :(得分: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。它并不像听起来那么复杂 - 脏工作隐藏在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方法。然后,当用户将鼠标移到它们上面时,所有子菜单都将打开。