2015-04-10 1 views
0

J'ai un bouton dans une application Java Swing pour zoomer sur une sélection. Je mis en œuvre 3 façons de cliquer dessus:Comment détecter une combinaison de touches de modification lors d'un clic sur un bouton dans Java

  • clic: effectue un zoom sur la sélection avec une animation étape par étape
  • option-clic: ne une seule étape de zoom vers la sélection
  • commande clic: effectue un zoom soudain sélection complète

Je voudrais mettre en œuvre les comportements inverses (c.-à-zoom de la sélection vers l'extérieur pour zoom-out complet) en outre, la touche Maj est, il serait comme ceci:

  • shift-clic: effectue un zoom arrière entièrement avec une animation étape par étape
  • shift-option-clic: fait un seul pas de zoom loin de la sélection
  • décalage de commande, cliquez sur: zoome brusquement zoom complet -out

Je sais comment faire tout sauf le shift-option-click et le shift-command-click. Par exemple. Voilà comment je fais le zoom en une seule étape:

int stepMask = InputEvent.ALT_MASK; 
if((e.getModifiers() & InputEvent.ALT_MASK) == stepMask) { 
    //do the single-step zoom 
} 

Mais je ne peux pas comprendre comment faire une combinaison de touches avec un clic. Tout ce que j'ai essayé ne fonctionne qu'avec une seule touche de modification. Comment puis-je détecter une combinaison de touches sur un bouton-clic?

Répondre

0

La valeur des modificateurs est une valeur bit ou or contenant tous les modificateurs InputEvent liés à l'événement. Pour identifier les modificateurs particuliers, cochez tout ce que vous jugez nécessaire pour la logique donnée:

if((e.getModifiers() & InputEvent.ALT_MASK) != 0 && (e.getModifiers() & InputEvent.SHIFT_MASK) != 0) { 
    //code for event 
} 
+0

Pourquoi ne simplifierait pas que pour si ((e.getModifiers() et (InputEvent. ALT_MASK | InputEvent.SHIFT_MASK)! = 0) { // code pour l'événement } – Grod

+0

@Gordon car ce code s'exécuterait si l'on maintenait la touche alt _or_ shift enfoncée – JakeRobb

+0

Non, ce n'est pas le cas, c'est un masque – Grod

-1

Il existe une approche plus gracieuse. Tout d'abord, définir votre masque combiné comme une constante:

private static final int SHIFT_OPTION_MASK = InputEvent.ALT_MASK | InputEvent.SHIFT_MASK; 

Puis, en ActionListener du bouton, faites ceci:

if((e.getModifiers() & SHIFT_OPTION_MASK) == SHIFT_OPTION_MASK) { 
    // code for event 
} 

Si vous avez beaucoup d'entre eux, vous pouvez aller plus loin. Commencez par définir un ENUM:

import java.awt.event.InputEvent; 

public enum ModifierKey { 
    ALT(InputEvent.ALT_MASK), 
    SHIFT(InputEvent.SHIFT_MASK), 
    CONTROL(InputEvent.CTRL_MASK), 
    COMMAND(InputEvent.META_MASK); 
    // add more enum values here as needed 

    public static boolean checkFor(ActionEvent e, ModifierKey... expectedModifiers) { 
     int expectedModifierMask = 0; 
     for (ModifierKey expectedModifier : expectedModifiers) { 
      expectedModifierMask |= expectedModifier.getMask(); 
     } 
     return (e.getModifiers() & expectedModifierMask) == expectedModifierMask; 
    } 

    private final int mask; 

    ModifierKey(int mask) { 
     this.mask = mask; 
    } 

    public int getMask() { 
     return mask; 
    } 
} 

Ensuite, dans votre actionListener, vous arrivez à le faire à la place:

import static ModifierKey.*; 

... 

if (checkFor(e, OPTION, SHIFT)) { 
    // code for event 
} 
+0

le downvoter anonyme, voulez-vous commenter? Je l'utilise dans la pratique. t fonctionne parfaitement, et IMO est beaucoup plus lisible. – JakeRobb

+0

20+ lignes et code utilisant une méthode personnalisée dans chaque événement que quelqu'un d'autre touchant le code doit se souvenir d'utiliser ou de rechercher quand il le voit pour la première fois, par rapport à la ligne 'if ((e.getModifiers() & (InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)! = 0) 'qui est parfaitement lisible lui-même? Ce n'est pas comme si les constantes InputEvent étaient nommées de manière confuse.Comment votre version est-elle "beaucoup plus lisible"? Cela ressemble à un passe-partout pour moi. – Grod

+0

Vous êtes plus que la bienvenue à cette opinion. :) Dans mon application Swing relativement grande, j'utilise la fonction checkFor dans des dizaines d'endroits (notez que dans ma réponse j'ai écrit "si vous en avez beaucoup". Je trouve que chacun d'entre eux est plus lisible et plus facile Pour que la syntaxe soit bonne, les 20 lignes supplémentaires (que je n'ai jamais à toucher) se payent facilement – JakeRobb