GXT按钮在第一次单击时显示菜单,在第二次单击时不会隐藏菜单

时间:2011-01-21 20:26:09

标签: java gwt gxt

这是预期的功能还是我做错了什么?

我正在做的就是创建一个GXT按钮并调用setMenu来附加一个GXT菜单。第一次单击时,菜单显示正确,第二次单击时,菜单在MouseDown上消失,但重新出现在MouseUp上。让菜单隐藏的唯一方法是单击远离按钮。

我通过添加另一个按钮确认代码中的特定按钮并不奇怪:

Button button = new Button("test");
Menu menu = new Menu();
button.setMenu(menu);
add(button);

如果是这样的话,是否有关于如何添加监听器以在第二次点击时关闭菜单的建议?

1 个答案:

答案 0 :(得分:0)

我猜它是按预期工作的,因为菜单一旦失去焦点就会一直隐藏。我在下面做的是覆盖菜单中的onAutoHide方法,如果按下具有指定ID的按钮(相应地改变)则不隐藏。这使我能够检查菜单是否显示在按钮的onClick方法中 - 然后不再显示它。但是请注意......我绝不是专家,这是一个黑客攻击:)

Button button = new Button("Test") {
        @Override
        protected void onClick(ComponentEvent ce) {
            ce.preventDefault();
            focus();
            hideToolTip();
            if (!disabled) {
                ButtonEvent be = new ButtonEvent(this);
                if (!fireEvent(Events.BeforeSelect, be)) {
                    return;
                }
                if (menu != null) {
                    if (!menu.isVisible())
                        showMenu();
                    else
                        hideMenu();
                }
                fireEvent(Events.Select, be);
            }
        }
    };
    button.setId("TESTBUTTONID");
    Menu menu = new Menu() {
        @Override
        protected boolean onAutoHide(PreviewEvent pe) {
            if (pe.getEventTypeInt() == Event.ONMOUSEDOWN
                    && !(pe.within(getElement()) || (fly(pe.getTarget())
                            .findParent(".x-ignore", -1) != null))
                    && !(fly(pe.getTarget()).findParent(".x-btn", -1) != null
                    && fly(pe.getTarget()).findParent(".x-btn", -1).getId()
                            .equalsIgnoreCase("TESTBUTTONID"))) {
                MenuEvent me = new MenuEvent(this);
                me.setEvent(pe.getEvent());
                if (fireEvent(Events.AutoHide, me)) {
                    hide(true);
                    return true;
                }
            }
            return false;
        }
    };
    button.setMenu(menu);
    RootPanel.get().add(button);