2014-06-19 23 views
5

Ich versuche einige Maus-Listener zu den Untermenüs/kaskadierenden Menüs der GWT-Menüleiste hinzuzufügen. Leider kann ich nicht direkt auf das Untermenü popuppanel zugreifen - die Methode dafür (getPopup()) ist privat. Und Sie können nicht auf Reflektion zugreifen, da GWT kompiliert.Wie kann ich auf ein GWT-Menü/Untermenü zugreifen?

Das Hinzufügen eines Maus-Listeners zur Hauptmenüleiste (um festzustellen, ob sich die Maus innerhalb der Grenzen der Menüleiste befindet) war einfach und schön. Aber ich kann keine Möglichkeit finden, einen Maus-Listener hinzuzufügen, um zu erkennen, wenn sich die Maus in einem der kaskadierenden Untermenüs befindet.

Was ich tue, ist dies:

com.google.gwt.user.client.ui.MenuBar myMainBar = new MenuBar(); 
myMainBar.addDomHandler(menuHoverOutHandler, MouseOutEvent.getType()); 
myMainBar.addDomHandler(menuHoverOverHandler, MouseOverEvent.getType()); 

Diese für die eigentliche GWT MenuBar funktioniert gut. Wenn ich die Maus einstecke, löst das mouseOverEvent aus. Wenn ich die Maustaste loslasse, wird das MouseOutEvent ausgelöst.

Das Problem ist, dass, wenn ich ein Untermenü aus der Hauptmenüleiste öffne, das Mouse in diesem Menü auch das MouseOutEvent auslösen wird. Ich brauche es nicht, um das zu tun.

Wenn ich Untermenü sage, meine ich so etwas wie die hier zu sehen diejenigen:

http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/MenuBar.html

So lange, wie ich in dem ‚main‘ Bar bin, den Style, Obst Listen und Laufzeit, die Maus Ereignisse erkennen dies.

Aber wenn ich auf das Untermenü, fett, kursiv, mehr, Dropdown-Menü, glaube, die Maus Ereignisse glauben, ich habe die Menüleiste vollständig verlassen. Ich brauche einen Weg, um festzustellen, ob sich die Maus in einem dieser Untermenüs befindet. (Oder, dass ein Untermenü dieser Hauptmenüleiste ist irgendwo offen)

Sie können nicht einfach tun

myMainBar.getPopup() 

und fügen Zuhörer zu dem resultierenden PopupPanel als getPopup privat ist. Ich suche nach einer anderen Möglichkeit, um zu MenuBar.popup

Es scheint, gibt es keine Methode zu sagen, ob eines der Untermenüs geöffnet ist, als auch, das ist ein bisschen verwirrend für mich. Es scheint einen frustrierenden Mangel an Möglichkeiten zu geben, mit diesen Untermenüs zu interagieren, und ich frage mich, ob mir etwas fehlt.

+1

Wie kann ich auf Ihren Code zugreifen? :) Kannst du bitte ein Stück Code teilen, der darüber erzählt, was du tust? – Braj

+0

Ich habe einen Code hinzugefügt, der zeigt, was ich mache, und einige zusätzliche Erklärungen. Vielen Dank für einen Blick! – user2197116

+0

Hast du es geschafft, das zu lösen? Ich stehe gerade vor genau diesem Problem ... – Sleeper9

Antwort

4

Wenn Sie ein MouseOverHandler und MouseOutHandler zu jedem Ihrer Untermenüs im Gegensatz zu Ihrer Hauptmenüleiste hinzufügen, sollte es tun, was Sie wollen.

Zum Beispiel:

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); 
+1

OP könnte dies verwenden, um ein Flag zu setzen und es ignorieren MouseOutEvent in der Haupt-Menüleiste, wenn Ihr Untermenü 'ausgeblutet' ist. – Brian

2

Ihr Problem auf die Logik der Ereignisse in Beziehung steht es selbst: Sie möchten, dass eine neue Art von Ereignis haben, nur dann, wenn die Maus bewegt aus Menüs löst und nicht wenn es sich zwischen Menüs bewegt.

Um dies zu tun, könnten Sie Code hinzufügen, der Mouvé-Over und Mouse-Out abhört und die verfügbaren Informationen kompilieren, um zu verstehen, was passiert.

können Sie sicher sein, einen Code auszuführen, nachdem alle durch die Verwendung eines Scheduler

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 
    } 
    }); 

dieser Code-Schnipsel bestanden Ereignisse sollten innerhalb der onMouseOut(), und einen anderen Code, der nur aktualisiert den Zustand der statischen Klasseninstanz gesetzt werden sollte in die onMouseOver() gelegt werden. Sie können sicher sein, dass der Code in Scheduler.execute() nach dem onMouseOver() ausgeführt wird, das dank des verzögerten Scheduling-Mechanismus ausgeführt wurde. Also, wenn Sie kommen, um den Zustand zu überprüfen, wird es sein, nachdem die Maus in ein anderes Menü eingegeben wurde (oder nicht); Sie können also wissen, ob der Benutzer die Menüpunkte wirklich verlassen hat oder ob er in ein Untermenü eingetreten ist.

Letzte Empfehlung: Führen Sie diesen Code in einer separaten Klasse aus, damit Sie dieses erweiterte Menü als Komponente für die zukünftige Verwendung verfügbar haben. Denken Sie auch daran, dass Sie automatisierte Testszenarien einfacher testen und ausführen können, wenn Sie die Dinge getrennt halten.

Ich hoffe, Sie alle verstanden ich versuchte zu erklären, wenn nicht, Kommentar fühlen Sie sich frei, werde ich mein Bestes versuchen Sie

Beste Grüße zu beantworten,

ps: wenn ich eine statische Instanz sagen Staat, es ist nur für die Leichtigkeit des Verständnisses. Es wird natürlich empfohlen, die statische Verwendung zu vermeiden, um mehr als ein Menü in derselben Anwendung zu haben. Mit statisch meine ich: eine Instanz, die für alle Komponenten zugänglich ist.

Verwandte Themen