2010-04-15 3 views
3

J'essaie dans GWT de créer un arbre avec une sélection multiple pour les nœuds et ai rencontré un problème similaire à cette question Shift Key in GWT?. Quand un événement selectionEvent est levé à partir de l'arborescence, je voudrais savoir si la touche Shift est enfoncée ou non.Dans GWT, comment savoir à partir d'un événement SelectionEvent dans un arbre si le bouton Shift est enfoncé

SelectionHandler<TreeItem> getSelectionHandler() { 
    return new SelectionHandler<TreeItem>(){ 
     @Override 
     public void onSelection(SelectionEvent<TreeItem> event) { 
      // is shift key pressed ? 
     } 
    }; 
} 

La solution dans la question ci-dessus ne peut appliquer dans ce cas comme la classe SelectionHandler ne hérite pas de DOMEvent et n'a pas de fonction getNativeEvent().

J'ai essayé une solution sale en ajoutant keyDownEventHandler et keyUpEventHandler à l'arborescence avec un indicateur booléen, mais les gestionnaires ne sont appelés que lorsque le focus est sur l'arborescence, donc cela ne fonctionne pas.

Existe-t-il une solution simple (ou juste une solution même si ce n'est pas simple)? Merci.

Modifier sur la réponse aem: La solution peut travailler en enfermant les composants dans un FocusPanel avec un keyUp/DownHandler mais en tant que gestionnaire « global » prend je ne peux pas ajouter une entrée du clavier besoin de composants tels que TextArea la priorité ... Donc ça ne résout pas vraiment mon problème.

Répondre

3

Ma suggestion consiste à créer une classe Tree personnalisée qui stocke temporairement l'événement et stocke cet événement en remplaçant la méthode onBrowseEvent. Ensuite, vous pouvez, dans votre méthode onSelection, vérifier si la touche Maj a été enfoncée en vérifiant cet événement stocké. Puisque JavaScript n'est pas concurrent, il ne devrait pas poser de problème en utilisant la variable privée. Le code serait quelque chose comme ceci:

public class MyTree extends Tree { 
    private Event currentEvent; 

    ... constructors... 

    // Call this method from within the onSelection method to determine if the shift key 
    // was pressed. 
    public boolean isShiftPressed() { 
     return currentEvent != null ? currentEvent.getShiftKey() : false; 
    } 

    @Override 
    public void onBrowserEvent(Event event) { 
    currentEvent = event; 
    super.onBrowserEvent(event); 
    currentEvent = null; 
    } 
} 
+0

fonctionne parfaitement bien, merci :) – Vinze

1

Je ne suis pas sûr que cela fonctionnera, mais il vaut la peine d'essayer:

Qu'en est l'ajout de gestionnaires clés au panneau racine contenant l'arbre, et les ont mis un booléen indiquant si la touche Maj est enfoncée ? Ensuite, SelectionHandler de l'arbre peut vérifier ce booléen. Le problème avec ceci est que la page peut contenir d'autres widgets qui capturent les événements clés, ce qui rendrait ce comportement floconneux pour l'utilisateur.

+0

qui est une solution que je considère donc je vais essayer ... – Vinze

Questions connexes