2010-08-13 3 views
3

pour mon application J'ai besoin de la touche d'espace pour appeler une fonction indépendante du widget ciblé, partout dans l'application mais seulement si l'onglet correspondant est ouvert. Je trouve que l'on peut ajouter un filtre à l'écran, comme ceci:SWT Global KeyListener Button Focus Problème

getShell().getDisplay().addFilter(SWT.KeyDown, new Listener() { 

      public void handleEvent(Event arg0) { 
       if(arg0.character == 32) { /**SPACE*/ 
        if(mainTabs.getSelection().equals(analyseSoundFilesTab)) { 
         soundController.playButtonClickHandler(); 
        } 
       } 
      } 

     }); 

Cela fonctionne bien la plupart du temps, mais si je donne un bouton au centre via l'onglet « shift » « onglet » ou, son un peu étrange - la barre d'espace va activer un "bouton enfoncé", comme si l'on cliquait sur le bouton avec la souris. Im un peu coincé maintenant, je ne sais pas comment éviter cela ... Pour les boutons, j'ai implémenté un SelectionListener.

Cordialement.

Répondre

2

Vous pouvez utiliser TraverseListener et la détection d'événements de presse désactivée à l'aide du champ doin. Voici un exemple de code:

display.addFilter(SWT.KeyDown, new Listener() { 
    public void handleEvent(Event e) { 
     if (e.character == 32) { 
      System.out.printf("Space detected %s\n", e); 
     } 
    } 
}); 

Button b1 = new Button(shell, SWT.PUSH); 
b1.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent se) { 
     System.out.printf("Button pressed %s\n", se); 
    } 
}); 

b1.addTraverseListener(new TraverseListener() { 
    @Override 
    public void keyTraversed(TraverseEvent te) { 
     System.out.printf("Traverse detected %s\n", te); 
     te.doit = true; 
    } 
}); 

Si addTraverseListener() n'existait pas, le bouton de l'espace a été détecté après le filtre, vous verriez « Space détecté ... » et après « Bouton pressé ... ». Maintenant que vous définissez te.doit = true, vous dites à SWT de faire une traversée de barre d'espace (qui ne fait rien en fait) au lieu de tirer sur l'écouteur de touche. Vous pouvez éventuellement vérifier le.détail pour empêcher uniquement les traversées mnémoniques.

2

Choisir la «touche espace» est le vrai problème, car c'est une caractéristique générale dans la plupart (tous?) OS que presser l'espace est égal à sélectionner le widget qui a le focus. Une solution de sortie consisterait à utiliser des widgets sous-classés Button qui ignorent l'espace. Mais cela dérouterait beaucoup d'utilisateurs, simplement parce qu'ils s'attendent à ce qu'un bouton focalisé soit sélectionné lorsqu'ils atteignent l'espace et ne s'attendent pas à une autre action.

+0

Pour clarifier ce que je veux: Peut-être connaissez-vous l'outil CoolEdit. Ils ont la fonction "play file" sur la barre d'espace, et mon chef le veut aussi. Vous avez raison, il va mélanger la manière standard. : / – InsertNickHere