2009-09-16 8 views
8

Ich baue eine AJAX-Webanwendung mit GWT, und ich möchte mit Rechtsklick für verschiedene Dinge, wie in einer Desktop-App. Mit der rechten Maustaste wird jedoch das Standard-Webkontextmenü erstellt, und void onClick (ClickEvent-Ereignis) wird nie aufgerufen. Hat jemand herausgefunden, wie man das zur Arbeit bringt? Vielen Dank!Rechtsklick in GWT?

+0

wenn es keine Hilfe ohne Standard-Browser-Kontextmenü zu verhindern, können Sie einen Rechtsklick fangen, indem Sie mousedownhandler statt clickhandler. – pistolPanties

Antwort

4

Es stellt sich heraus, dass Sie es tun können, indem Sie DeckPanel erweitern. Hier ist eine ausgezeichnete Diskussion, zusammen mit einer netten Demo, die beweist, dass es funktioniert.

http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/

+0

das ist effizient und wird komplizierte Anwendungen mit vielen Objekten auf dem Bildschirm gerendert werden, da Sie nicht die Core-Ereignis-Engine in gwt verwenden. –

2

Zwar gibt es Möglichkeiten, es zu tun, ich glaube, das GWT-Team eine Debatte darüber hatte und beschlossen, in einem Web-App Rechtsklick ermöglicht war eine schlechte Sache und machte so die concious Entscheidung nicht zu unterstützen. Das Argument war, dass der Rechtsklick weiterhin wie erwartet funktionieren sollte (das Rechtsklick-Kontextmenü des Host-Browsers aufrufen), und das Überschreiben war ein Bruch dieses erwarteten Verhaltens und das wäre eine schlechte Übung. Während ich Instanzen hatte, in denen ein Rechtsklickkontextmenü allgemein nützlich sein würde, neige ich dazu, der Entscheidung des GWT-Teams zuzustimmen.

+5

Ich konnte nicht mehr widersprechen. Ich vermute, dass die Mehrheit der GWT-Entwickler GWT verwendet, um die Desktop-Erfahrung besser nachzuahmen. Und das schließt kontextbezogene (rechte) Klicks ein. Es gibt viele Unternehmensanwendungen, bei denen es sinnvoll ist, die richtigen Klicks zu verwenden. –

+0

Ich weiß, was du meinst, ich war ziemlich frustriert, dass der Rechtsklick zuerst fehlte, aber nachdem ich das Argument des GWT-Teams gelesen hatte, kam ich langsam um. –

+0

@Daniel Vaughan: Interessanter Punkt. Ich würde das abstimmen, wenn Sie einen Link zu der von Ihnen erwähnten GWT-Diskussion hinzufügen würden. –

7

easy peasy, fügen Sie einen Listener im contextmenuhandler hinzu, der ein Widget basierend darauf anzeigt, wo das Benutzerrecht klickt. https://confluence.clazzes.org/pages/viewpage.action?pageId=425996

class MyWidget extends Composite implements ContextMenuHandler { 

    // just an example, use a meaningful Widget here... 
    private Widget base; 

    private PopupPanel contextMenu; 


    public MyWidget() { 
    // initialize base widget, etc... 

    this.contextMenu = new PopupPanel(true); 
    this.contextMenu.add(new HTML("My Context menu!")); 
    this.contextMenu.hide(); 

    initWidget(this.base); 

    // of course it would be better if base would implement HasContextMenuHandlers, but the effect is the same 
    addDomHandler(this, ContextMenuEvent.getType()); 
    } 


    public void onContextMenu(ContextMenuEvent event) { 
    // stop the browser from opening the context menu 
    event.preventDefault(); 
    event.stopPropagation(); 


    this.contextMenu.setPopupPosition(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY()); 
    this.contextMenu.show(); 
    } 

} 

schließlich wollen Sie das Browser-Menü für volle Überlastung dieser Art von Kontextmenü deaktivieren. Das sollte in allen Browsern außer Oper funktionieren. aber ehrlich gesagt verwendet, wer das in diesen Tagen neways^_______^

<body oncontextmenu="return false;"> 
+0

Sie erhalten einen Upvote für das . Dieser Teil hat mich verrückt gemacht! – Jamie

+0

Das ist die Magie! Du hast keine Ahnung, wie viele Jahre ich gebraucht habe, um das herauszufinden, bevor die JS-Frameworks in der Nähe waren! –