2011-11-09 25 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)方法即可。然後當用戶將鼠標移到它們上面時,所有的子菜單都會打開。