[英]How can I access a GWT menubar popup panel / submenu?
我正在嘗試將一些鼠標監聽器添加到GWT的MenuBar的子菜單/級聯菜單中。 可悲的是,我似乎無法直接訪問子菜單popuppanel - 這樣做的方法(getPopup())是私有的。 由於GWT編譯的方式,你無法通過反射訪問它。
將鼠標監聽器添加到主菜單欄(以檢測鼠標何時位於菜單欄邊界內)非常簡單。 但我無法想辦法添加一個鼠標監聽器來告訴鼠標何時進入其中一個級聯子菜單。
我在做什么是這樣的:
com.google.gwt.user.client.ui.MenuBar myMainBar = new MenuBar();
myMainBar.addDomHandler(menuHoverOutHandler, MouseOutEvent.getType());
myMainBar.addDomHandler(menuHoverOverHandler, MouseOverEvent.getType());
這適用於實際的GWT MenuBar。 當我鼠標進入時,mouseOverEvent會觸發。 當我鼠標移出時,MouseOutEvent會觸發。
問題是如果我從主菜單欄打開一個子菜單,鼠標進入該菜單也會觸發MouseOutEvent。 我不需要那樣做。
當我說子菜單時,我的意思是這里看到的東西:
http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/MenuBar.html
因此,只要我在列出Style,Fruit和Term的'main'欄中,鼠標事件就會識別出來。
但是,如果我下到菜單上顯示Bold,Italicized,More,那么鼠標事件就相信我完全離開了菜單欄。 我需要一種方法來確定鼠標是否位於其中一個子菜單中。 (或者這個主菜單欄的子菜單在某處打開)
你不能簡單地做
myMainBar.getPopup()
並將偵聽器添加到生成的PopupPanel中,因為getPopup是私有的。 我正在尋找另一種方法來獲取MenuBar.popup
似乎沒有方法可以判斷其中一個子菜單是否打開,這對我來說有點令人困惑。 似乎有一種令人沮喪的缺乏與這些子菜單交互的能力,我想知道我是否遺漏了一些東西。
如果將MouseOverHandler
和MouseOutHandler
添加到每個子菜單而不是主菜單欄,它應該可以執行您想要的操作。
例如:
MenuBar subMenu = new MenuBar(true);
subMenu.addItem("Item1", new Command() {
@Override
public void execute() {
Window.alert("Item1 clicked");
}
});
subMenu.addDomHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent arg0) {
Window.alert("SubMenu over!");
}
}, MouseOverEvent.getType());
subMenu.addDomHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent arg0) {
Window.alert("SubMenu out!");
}
}, MouseOutEvent.getType());
MenuBar mainMenu = new MenuBar();
mainMenu.addItem("SubMenu", subMenu);
RootPanel.get().add(mainMenu);
您的問題與其自身的事件邏輯有關:您希望有一種新類型的事件,只有當鼠標移出菜單時才會觸發,而如果它在菜單之間移動則不會觸發。
要做到這一點,您可以添加偵聽mouve和mouse out的代碼,並編譯可用信息以了解發生的情況。
您可以確保在使用調度程序傳遞所有事件后執行代碼
Scheduler.get().scheduleDeferred(new Command() {
public void execute () {
//check all what happened in a static shared variable, there was a mouse out, was there a mouse over after it? if yes then stay calm; If there wasn't, then trigger a MouseOutOfAllMenus event
}
});
此代碼段應放在onMouseOut()
,另一個只更新靜態類實例狀態的代碼應放在onMouseOver()
。 由於Scheduling延遲機制,您可以確保在執行onMouseOver()
之后, Scheduler.execute()
的代碼將執行。 所以當你來檢查狀態時,它會在鼠標進入另一個菜單后(或沒有); 因此,您可以知道用戶是否真的離開了菜單項,或者他是否已進入子菜單。
最后推薦:在單獨的類中執行此代碼,以便您可以將此豐富菜單作為組件提供以供將來使用。 另外請記住,通過保持獨立性,您可以更輕松地測試和運行自動化測試場景。
我希望你理解我試圖解釋的所有內容,如果沒有,請隨意發表評論,我會盡力回答你
最好的祝福,
ps:當我說一個靜態實例狀態時,它只是為了便於理解。 當然建議避免靜態使用,以便在同一個應用程序中有多個菜單。 靜態我的意思是:所有組件都可以訪問的實例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.