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

Composants Java Discussion :

Problème KeyListener et JPanel


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut Problème KeyListener et JPanel
    Bonsoir,
    Je poste car j'ai un problème pour ajouter un KeyListener à mon Programme.
    J'ai déjà regarder plusieurs postes montrant comment en ajouter à des JPanel ou à des JFrame, j'ai tout essayer mais aucun de cela ne marche.
    Mon code est comme suit:
    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
     
    //Définitions de toutes les variables
    public class Terrain extends JPanel implements KeyListener
    {
    public Terrain(Jeu je)
    {
    //affections de certaines variables
            setFocusable(true);
            this.requestFocusInWindow(true);
            addKeyListener(this);
     
    }
    public void initialisation()
    {
    //on affecte des valeurs aux variables
    }
    public void go()
    {
    //Algorithme avec un timer
    }
    public void keyPressed(KeyEvent e)
    {
    this.initialisation();
    this.go();
    }
    public void keyReleased(KeyEvent e) {
    }
    public void keyTyped(KeyEvent e) {
    }
    }
    J'essaie en fait de développer un Pong et j'aimerais que le jeu démarre en appuyant sur la touche Entrée.
    Pour l'instant j'essai déjà de le faire fonctionner en appuyant sur n'importe quel touche mais le KeyListener ne fonctionne pas.
    Merci pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Bonjour,
    au niveau ton constructeur, as-tu un appel au constructeur de JPanel, comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Terrain(Jeu je)
    {
            super();
    //....
    //affections de certaines variables
            setFocusable(true);
            this.requestFocusInWindow(true);
            addKeyListener(this);
     
    }
    Si c'est le cas... tu peux essayer d'utiliser le keyReleased:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //...
    public void keyPressed(KeyEvent e)
    {
    }
    public void keyReleased(KeyEvent e) {
    this.initialisation();
    this.go();
    }
    public void keyTyped(KeyEvent e) {
    }
    En esperant que ca t'aide...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut
    Je n'avais pas utilisé le super car cette classe est en setContentPane dans une autre classe.
    J'ai donc essayé d'ajouter de super(); comme tu me l'a dis,
    ensuite j'ai essayé de mettre ma procédure en KeyPressed Released ou Typed mais cela ne marche toujours pas.
    j'ai vérifié ma procédure fonctionne bien puisque j'arrive à la lancer en ayant ajouté un actionListener à un bouton.
    Si vous avez une quelconque idée d'où peut provenir le problème je vous en remercie!

  4. #4
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    En fait je t'ai dis une betise... dsl

    Gere ton keylistener dans le conteneur de ton Terrain. Là actuellement tu ecoute les objets contenus dans ton Terrain et pas Terrain (c'est pour ca que ca marche qd tu ajoute un bouton).

    En supposant que ce soit une JFrame:
    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
     
    public class MaFrame extends JFrame implements KeyListenerAdapter{
     private Terrain monTerrain;
     
     public MaFrame(){
      super();
      this.setContentPane(this.getMonTerrain());
      //...
     }
     
     private Terrain getMonTerrain(){
      if(monTerrain==null){
       monTerrain=new Terrain();
       monTerrain.addKeyListener(this);
       //..
      }
      return monTerrain;
     }
     
     public void keyPressed(KeyEvent e){
      Objet source=e.getSource();
     
      if(source.equals(monTerrain)){
       //tu lance ta partie
      }
     }
    }
    Bon cette fois-ci ca devrai marcher

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Par défaut
    J'ai essayé d'adapter le code à mon programme mais j'ai dût commettre des erreurs parce que cela ne marche toujours pas.
    J'explique sommairement comment sont organisées mes classes:
    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
    public class Pong extends JFrame implements KeyListener
    {private Jeu jeu= new Jeu(this);
    //ajouts de variables pour le menu.
    public Pong()
    	{
    		super("Pong"); // Nom de la fenêtre
             }
    public void demarrer(int difficulte_jeu,int ball_color_jeu, int mode_de_jeu, String nomj1, String nomj2, int char1, int char2)
    	{
    		jeu.noms(nomj1, nomj2); //on appelle la procédure qui va communiquer les noms Ã* Jeu.javajeu
    		jeu.infos(difficulte_jeu, ball_color_jeu, mode_de_jeu,char1,char2); // on appelle la procédure qui va communiquer les couleurs au paint
    		ecran3.setVisible(false); //on cache le panneau du menu
    		jeu.setVisible(true); //on affiche celui du plateau de jeu avec les scores
    		setContentPane(this.getJeu());//on affiche celui du plateau de jeu avec les scores
    		jeu.init(); //on appelle la procédure d'initialisation du plateau de jeu
    	}
    }
    Donc ça c'est globalement ce qui concerne le JFrame, il apelle la classe Jeu qui est un extends JPanel comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Jeu extends JPanel
    {
    public Terrain terrain = new Terrain (this); // variable de type Terrain
    //Initialisation des variables pour la partie avec les JLabel	
    public Jeu(Pong pg)
    {
    //placement des éléments dans une grille et placement du JPanel terrain grâce à la grille.
    }
    }
    C'est encore une description global encore une fois!
    Et enfin la classe Terrain comme je vous l'avais montré auparavant:
    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
     
    //Définitions de toutes les variables
    public class Terrain extends JPanel implements KeyListener
    {
    public Terrain(Jeu je)
    {
    //affections de certaines variables
            setFocusable(true);
            this.requestFocusInWindow(true);
            addKeyListener(this);
     
    }
    public void initialisation()
    {
    //on affecte des valeurs aux variables
    }
    public void go()
    {
    //Algorithme avec un timer
    }
    public void keyPressed(KeyEvent e)
    {
    this.initialisation();
    this.go();
    }
    public void keyReleased(KeyEvent e) {
    }
    public void keyTyped(KeyEvent e) {
    }
    }
    Comme vous me l'aviez dit dans votre dernière réponse j'ai modifié le JFrame comme suit:
    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
    	private Jeu getJeu()
    		{
    		   jeu.addKeyListener(this);
    		   return jeu;
    		}
     
    	@Override
    	public void keyPressed(KeyEvent e) 
    	{
    		// TODO Auto-generated method stub
    		java.lang.Object source=e.getSource();
     
    		  if(source.equals(jeu))
    		  {
    		   //tu lance ta partie
    			  jeu.terrain.go();
    		  }
     
    	}
    A ajouter à la fin du 1er code que je vous ai montrer dans cette réponse.
    Voilà j'ai donc adapté aussi avec un JPanel, je pensais que cela marcherais car les objets de types terrain sont contenu dans les JPanel jeu, donc pour moi (au niveau pratique) cela ne fait aucune différence si les touches sont écoutés depuis les objets jeu ou les objets terrain.
    Voilà Je m'en remets donc à votre expertise!
    Merci encore!

  6. #6
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Je vois pas trop ce qui cloche...
    As-tu des keyListener sur tous les elements de ton Terrain?

  7. #7
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Comme tu n'as poster qu'un code partiel, c'est difficile de savoir ce qui cloche. On ne sait même pas comment tu construis ton interface.

    Une voie possible est de rendre non focusable tous les composants sauf celui que tu veux écouter, que tu rend précisément focusable.

    Si tu veux plus d'aide, alors post la totalité du code (au moins celui de l'interface) et testable.

Discussions similaires

  1. Problème affichage Image Jpanel
    Par lerorodu51 dans le forum NetBeans
    Réponses: 17
    Dernier message: 10/06/2009, 19h43
  2. problème avec un jpanel cliquable
    Par isoman dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 05/03/2009, 14h01
  3. Problème paintComponent et JPanel
    Par nuandafr dans le forum Composants
    Réponses: 8
    Dernier message: 08/10/2008, 09h33
  4. Problème décalage du JPanel dans une JFrame a cause du JMenuBar
    Par matou72 dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 09/03/2007, 20h17
  5. Réponses: 7
    Dernier message: 05/06/2006, 13h44

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