2011-01-21 17 views
0

これは意図した機能ですか、何か間違っていますか?GXTボタンは最初のクリックでメニューを表示し、2回目のクリックでメニューを非表示にしません

私がやっていることは、GXTボタンを作成し、setMenuを呼び出してGXTメニューをアタッチすることです。最初のクリックではメニューが正しく表示され、2度目のクリックでメニューはMouseDownで消えますが、MouseUpに再び表示されます。メニューを非表示にする唯一の方法は、ボタンからクリックすることです。

私はそれが別のボタンを追加することによって、自分のコード内の特定のボタンで奇妙なものではないことを確認した。これが意図されている場合は、

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

閉じるためのリスナーを追加する方法の提案があります2回目のクリックでメニューを開きますか?

答えて

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); 
関連する問題