Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Résolu]Un petit probleme de listener

Je ne comprend rien u.u

    20 décembre 2009 à 1:53:01

    Tout d'abord bonsoir a tous (Ou Bonjour quand vous lirez xD)

    Après m'être amusé avec l'animation de la balle présentée dans le tutoriel Java et l'avoir un peu améliorée (Parce qu'une seule balle ne m'amusais pas :D )

    J'en viens à mon nouvel objectif... Je voudrai par exemple avoir un Carré qui se déplace lorsque j'appuie sur les flèches directionnelles de mon clavier, donc je commence par créer une classe Carre, une classe Fenêtre qui extends de JFrame et une classe PanelGraph qui extends de JPanel...

    Jusque là pas de problème :)

    Mais (là où entre en jeu mon problème)

    Pour le listener j'ai donc commencé par créer une classe CarreListener qui extends de KeyAdapter (Pour éviter d'avoir a taper des méthodes vides)

    Avec dedans le code suivant :

    public void keyTyped(KeyEvent e) {
    		int keyCode = e.getKeyCode();
    		if(keyCode == KeyEvent.VK_UP)
    		{
    			unCarre.setPosY(unCarre.getY()+7);
    			if(unCarre.getY()>getHeight()-unCarre.getCote())
    				unCarre.setPosY(getHeight()-unCarre.getCote());
    		}
    		else
    			if(keyCode == KeyEvent.VK_DOWN)
    			{
    				unCarre.setPosY(unCarre.getY()-7);
    				if(unCarre.getY()<0)
    					unCarre.setPosY(0);
    			}
    		else
    			if(keyCode == KeyEvent.VK_LEFT)
    			{
    				unCarre.setPosX(unCarre.getX()-7);
    				if(unCarre.getY()<0)
    					unCarre.setPosX(0);
    			}
    			else
    			{
    				unCarre.setPosX(unCarre.getX()+7);
    				if(unCarre.getY()<getWidth())
    					unCarre.setPosX(getWidth()-unCarre.getCote());
    			}
    		
    	}
    


    D'une je doute déjà qu'il soit bon... mais ensuite je ne sais pas vraiment sur quel élément je dois l'ajouter... j'aurai bien pensé a le lier avec mon Carre(d'où le nom donné au lisener :o ) mais... impossible puisque je n'ai pas la méthode addKeyListener dans ma class Carre.

    Ma question est donc simple, pouvez vous m'aider à résoudre mon problème en m'aidant à comprendre un peu mieux le fonctionnement de ces fameux écouteurs (Passer à côté d'un truc ultra important c'est relativement rageant d'autant plus que je galère dessus depuis hier) et en me disant si je pars dans la bonne direction (important aussi XD)

    Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      20 décembre 2009 à 11:01:30

      Seuls les containers peuvent recevoir des événements du clavier, donc tu dois appeller addKeyListener sur ton JPanel ou ta JFrame.
      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2009 à 12:42:06

        Oki, alors en faisant comme tu dis j'y arrive pas, enfin plutôt le carre ne bouge pas (donc ca doit être une erreur avec le listener ou ma façon de l'ajouter... u.u)

        je fais dans ma classe Fenetre

        //Création du listener
        CarreListener list = new CarreListener();
        Container c = this.getContentPane();
        c.addKeyListener(list);
        


        Et j'ai ajouté à la fin de mon CarreListener

        panel.repaint();
        


        De plus mon CarreListener est une inner-classe dans ma classe Fenêtre

        Est-ce la bonne façon de faire? :euh:
        Je suis un peu perdu je l'avoue.
        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2009 à 13:30:46

          Ton CarreListener n'a sans doute pas accès à ton carré et ton panel. Peux-tu nous montrer le code de CarreListener?
          • Partager sur Facebook
          • Partager sur Twitter
            20 décembre 2009 à 14:20:48

            Bien sûr la voilà (le même que dans mon premier message en fait ^^') :)
            (Je l'ai renommé en ClavierListener pour avoir un nom un peu mieux vu qu'il n'écoutera pas le Carré)
            class ClavierListener extends KeyAdapter
            	{
            		public void keyTyped(KeyEvent e)
            		{
            			int keyCode = e.getKeyCode();
            			if(keyCode == KeyEvent.VK_UP)
            			{
            				unCarre.setPosY(unCarre.getY()+7);
            				if(unCarre.getY()>getHeight()-unCarre.getCote())
            					unCarre.setPosY(getHeight()-unCarre.getCote());
            			}
            			else
            				if(keyCode == KeyEvent.VK_DOWN)
            				{
            					unCarre.setPosY(unCarre.getY()-7);
            					if(unCarre.getY()<0)
            						unCarre.setPosY(0);
            				}
            				else
            					if(keyCode == KeyEvent.VK_LEFT)
            					{
            						unCarre.setPosX(unCarre.getX()-7);
            						if(unCarre.getY()<0)
            							unCarre.setPosX(0);
            					}
            					else
            					{
            						unCarre.setPosX(unCarre.getX()+7);
            						if(unCarre.getY()<getWidth())
            							unCarre.setPosX(getWidth()-unCarre.getCote());
            					}
            			
            			panel.repaint();
            			System.out.println(keyCode);
            		
            		}
            	
            	}
            


            (le System.out.println je l'ai ajouté pour savoir s'il se passait quelque chose mais rien O_o)

            Pour que le listener ait accès au carré j'avais pensé a mettre ce carré en private dans la fenêtre
            private Carre unCarre = new Carre(300,250,50); // de la forme Carre(posX,posY,cote)
            


            Sauf que j'ai tellement trifouillé le machin que finalement, le mieux serait de le recommencer totalement en repartant sur de bonnes bases je pense... (Ou pas si ça viens à marcher... mettre des listener sur des boutons c'est plus simple TT_TT)

            Merci m'accorder du temps en tout cas


            EDIT : Le code marchait en fait.... juste que ca ne répondait pas aux touches "flèches" comme je le voulait... donc eum... si quelqu'un sait pourquoi :(

            EDIT 2 : C'est carrement toutes touche spéciales (Ctrl, alt, pg.suiv, etc) qui ne sont pas prises en compte... je suis sûr qu'il y a une possibilité pour quand même les capter...
            Merci de me venir en aide ;_;

            EDIT 3 : Voilà c'est mon dernier Edit ^^ j'ai enfin trouvé la réponse a ma question et tout fonctionne a merveille ^^

            Je dis quand même au cas ou quelqu'un se trouverai dans mon cas plus tard ^^

            Il fallait utiliser :
            public void keyPressed(KeyEvent e)
            

            Au lieu de :
            public void keyTyped(KeyEvent e)
            


            On a ainsi accès aux codes de toutes les touches (logique... j'aurai un peu du comprendre le keyTyped... vu qu'on ne tape pas des flèches u.u mais on Appuie sur les fleches donc keyPressed)

            Voili Voilou, même si je doute que ça serve à quelqu'un j'ai préféré expliquer ce qui clochait (Et un merci a BoudBoulMan pour son aide).
            • Partager sur Facebook
            • Partager sur Twitter

            [Résolu]Un petit probleme de listener

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown