IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Problème d'initialisation d'un KeyEvent


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut Problème d'initialisation d'un KeyEvent
    Donc cela fait plusieurs semaines que je suis bloqué sur quelque chose de normalement simple. Je ne sais pas comment initialiser mon KeyEvent, je reçois Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException ceci.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyAdapter;
     
    public class PriseDeTouches extends KeyAdapter {
     
        KeyEvent dep;
        boolean gauche;
        boolean haut;
        boolean droit; 
        boolean bas;
     
     
        public void PriseDeTouches(){        
            keyPressed(dep);
            keyReleased(dep);
        }
     
        @Override
        public void keyPressed(KeyEvent arg0) {
            System.out.println("fonction presse +1");
            int keycode = arg0.getKeyCode();
            switch(keycode){
                case KeyEvent.VK_UP :
                    haut = true; 
                    System.out.println("Touche haut +1");
                    setHaut(haut);
                    getHaut();
                case KeyEvent.VK_LEFT :
                    gauche = true;
                    System.out.println("Touche gauche +1");
                    setGauche(gauche);
                    getGauche();
                case KeyEvent.VK_RIGHT :
                    droit = true;
                    System.out.println("Touche droite +1");
                    setDroit(droit);
                    getDroit();
                case KeyEvent.VK_DOWN :
                    bas = true;
                    System.out.println("Touche bas +1");
                    setBas(bas);
                    getBas();
                default : 
                    break;
            } 
        }        
     
     
     
        @Override
        public void keyReleased(KeyEvent arg0) {
            System.out.println("fonction presse -1");
            int keycode = arg0.getKeyCode();
            switch(keycode){
                case KeyEvent.VK_UP :
                    haut = false; 
                    System.out.println("Touche haut -1");
                    setHaut(haut);
                    getHaut();
                case KeyEvent.VK_LEFT :
                    gauche = false;
                    System.out.println("Touche gauche -1");
                    setGauche(gauche);
                    getGauche();
                case KeyEvent.VK_RIGHT :
                    droit = false;
                    System.out.println("Touche droite -1");
                    setDroit(droit);
                    getDroit();
                case KeyEvent.VK_DOWN :
                    bas = false;
                    System.out.println("Touche bas -1");
                    setBas(bas);
                    getBas();
                default :    
                    break;
            }
        }
        public boolean getHaut(){
            return haut;
        }
     
        public boolean getBas(){
            return bas;
        }
     
        public boolean getGauche(){
            return gauche;
        }
     
        public boolean getDroit(){
            return droit;
        }
     
        public void setHaut(boolean haut){
            this.haut = haut;
        }
     
        public void setBas(boolean bas){
            this.bas = bas;
        }
     
        public void setGauche(boolean gauche){
            this.gauche = gauche;
        }
     
        public void setDroit(boolean droit){
            this.droit = droit;
        }   
     
        @Override
        public void keyTyped(KeyEvent ke) {
     
        }
    }
    Du coup si quelqu'un peut m'aider, j'ai déjà essayer beaucoup de solutions mais peut-être que je les faisais mal.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Un KeyListener est prévu pour écouter (listener=écouteur) les évenements sur un composant donné.

    Exemple, tiré de la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    monTextField.addKeyListener(new KeyAdapter() {
    	public void keyTyped(KeyEvent e) {
    	}
    });
    Quel est le composant source que tu voudrais écouter ?

    En fonction du besoin, tu peux également utiliser un KeyEventDispatcher, qui te permettra d'écouter globalement dans ton interface graphique les évenements clavier, sans écouter un composant en particulier (écoute les composants qui ont le focus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    manager.addKeyEventDispatcher(new KeyEventDispatcher() {
     
       public boolean dispatchKeyEvent(KeyEvent e) {
           ...
       }
     
    }
    Dans les 2 cas, tu n'as pas a générer les instances de KeyEvent : c'est SWING qui s'en chargera.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Ok, dans mon cas je vais plutôt utilisé le KeyEventDispatcher car je souhaite récupérer mes entrées clavier mais aussi des entrée souris que je n'ai pas encore codé, si j'ai bien compris j'aurai juste à donné le focus à l'un ou à l'autre par la suite. Je ne vois pas comment placer le KeyEventDispatcher dans mon code. Je vais continuer de chercher avec ce que tu m'a donné, merci.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu peux le faire par exemple tout simple au début de ton programme (dans la méthode main(), ou la méthode qui affiche ta fenêtre (JFrame) principale).

    Des discussions avec exemples :

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Merci bien pour cette aide, je récupère bien les entrées clavier maintenant donc voici mon code refait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    package props.fall;
     
    import java.awt.KeyEventDispatcher;
    import java.awt.KeyboardFocusManager;
    import java.awt.event.KeyEvent;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
     
    public class Deplacement {
     
        public int posXPersonnage;
        public int posYPersonnage;
     
            KeyEventDispatcher keyEventDispatcher = new KeyEventDispatcher() {
    	@Override
                public boolean dispatchKeyEvent(KeyEvent e) {
                                    System.out.println("+2");
                                    int posXPersonnage = getPosXPersonnage();                          
                                    int posYPersonnage = getPosYPersonnage();
                                    setPosXPersonnage(posXPersonnage);
    				try {switch (e.getKeyCode()) {
    				case KeyEvent.VK_UP:
    					posXPersonnage = posXPersonnage - 4;
                                            setPosXPersonnage(posXPersonnage);
                                            getPosXPersonnage();
    					break;
    				case KeyEvent.VK_DOWN:
                                            posYPersonnage = posYPersonnage - 4;
                                            setPosYPersonnage(posYPersonnage);
                                            getPosYPersonnage();					
    					break;
    				case KeyEvent.VK_RIGHT:
    					posXPersonnage = posXPersonnage + 4;
                                            setPosXPersonnage(posXPersonnage);
                                            getPosXPersonnage();
    					break;
    				case KeyEvent.VK_LEFT:
    					posYPersonnage = posYPersonnage + 4;
                                            setPosYPersonnage(posYPersonnage);
                                            getPosYPersonnage();
    					break;
                                    }
                                    Thread.sleep(5);
            } 
            catch (InterruptedException ex) {
                        Logger.getLogger(Deplacement.class.getName()).log(Level.SEVERE, null, ex);
            }
                                    return false;
                }
     
            };
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyEventDispatcher);
     
        }
     
        public void setPosXPersonnage(int posXPersonnage){
            this.posXPersonnage = posXPersonnage;
        }
     
        public void setPosYPersonnage(int posYPersonnage){
            this.posYPersonnage = posYPersonnage;
        }
     
        public int getPosXPersonnage(){
            return posXPersonnage;
        }
     
        public int getPosYPersonnage(){
            return posYPersonnage;
        }
    }
    Le problème que j'ai maintenant c'est que je ne ressors plus de la boucle. Si j'appuie sur une touche je rentre dans mon switch pour touche du haut, puis je sors plus de mon dispatch.
    Et mes get/set ne marche plus, (je peux trouver seul ça normalement, ça doit venir du fait que je ne sors plus de ma boucle).

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ton code n'est pas complet, là... C'est surtout le KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyEventDispatcher); qui m'intrigue, parce que là, on voit pas bien où il se trouve exactement (ça compile pas) : j'espère qu'il n'est pas dans la méthode dispatchKeyEvent(), sinon ça veut dire à chaque appui de touche va ajouter un même KeyEventDispatcher, qui fait la même chose, du coup ton personnage, va se déplacer une fois de plus à chaque appui (tu appuies, il se déplace de 4, puis tu rappuies, il se déplace de 2x4=8, puis 12, 16...)

    De quelle boucle parle-tu ? Parce que dans ce bout de code, je ne vois aucune boucle.

    Par ailleurs, c'est quoi ce sleep ? Les évènements SWING, comme ceux du clavier en l’occurrence, sont exécutés dans l'Event Dispatch Thread (le thread des SWING, qui sert également à gérer l'affichage) : donc ce sleep bloque SWING, pas longtemps certes, mais il ne faut jamais faire ça.

    Les appels aux getters que tu fais dans le switch ne servent strictement à rien (le getter retourne une valeur que tu ne récupères même pas dans une variable, alors en faire quelque chose...). Le premier setPOSXPersonnage() en dehors du switch ne sert à rien, sauf à perdre du temps (posXPersonnnage n'a pas été modifié depuis le get).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int posXPersonnage = getPosXPersonnage();                          
    int posYPersonnage = getPosYPersonnage();
     
    try {switch (e.getKeyCode()) {
       case KeyEvent.VK_UP:
           posXPersonnage = posXPersonnage - 4; // ou posXPersonnage -= 4;
           break;
        case KeyEvent.VK_DOWN:
           posYPersonnage = posYPersonnage - 4;				
           break;
        case KeyEvent.VK_RIGHT:
           posXPersonnage = posXPersonnage + 4;
           break;
        case KeyEvent.VK_LEFT:
           posYPersonnage = posYPersonnage + 4;
        break;
    }
     
    setPosXPersonnage(posXPersonnage);
    setPosYPersonnage(posYPersonnage);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'initialisation
    Par Gryzzly dans le forum C
    Réponses: 3
    Dernier message: 26/12/2005, 12h24
  2. Problème d'initialisation de winsock
    Par benjiprog dans le forum C
    Réponses: 6
    Dernier message: 18/12/2005, 10h45
  3. Problème d'initialisation avec GLFW
    Par adrien357 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 23/10/2005, 18h29
  4. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30
  5. Pitié, aidez moi : Problème d'initialisation de postgreSQL
    Par ttalourd dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 16/11/2004, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo