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

Agents de placement/Fenêtres Java Discussion :

[debutant] additionner keylistener, Jframe et une boucle


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [debutant] additionner keylistener, Jframe et une boucle
    Bonjour

    voila un certains temps que je me casse la tête sur un problème surement débile pour un non débutant.
    Je doit créer un mini jeux avec un personnage vue de dessus (genre Zelda) que l'on peu déplacer sur un panel de JFrame.
    Le problème est comment écouter le clavier tout en affichant une JFrame et en bouclant sur un while(true) dans la classe principale (celle qui apelle la JFrame) avec dans ce while un pose de 100 ms à chaque tours afin de laisser le cpu tranquille et de laisser le temps au key listener d'enregistrer si la touche est préssé, ou si on la relache ?

    Voila mon problème.
    si quelqu'un pouvait m'aider ca serai sympas.

    Merci d'avance

    Laguna

  2. #2
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Lorsque tu lances ta frame, il y a déja une boucle qui l'affiche (c'est pourquoi elle est lancée dans un thread séparée)
    Par défaut, il me semble que les frames propagent les entrées au clavier.

    Pour ton problème, je crée une classe qui implemente l'interface KeyListener
    et qui dans la méthode public void keyPressed(KeyEvent e) définit le code à executer en fonction de la touche activée. Pas besoin de rajouter à mon avis un timer qui va ralentir (à moins de créer un autre thread ...)
    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
     
    public class ZeldaKeyController implements KeyListener
    {
        public void keyTyped(KeyEvent e)
        {
        }
     
        public void keyPressed(KeyEvent e)
        {
            // Code à exécuter en fonction de e
        }
     
        public void keyReleased(KeyEvent e)
        {
        }
    }
    Dans ta frame, tu enregistres ton listener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ZeldaKeyController zkc = new ZeldaKeyController();
    frame.addKeyListener(zkc);

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  3. #3
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    Le while(true) et le Thread.sleep(100) c'est pas top, parce que le Thread.sleep(100) stoppe vraiment ton programme pendant 100ms, et l'attente active ca va te donner des resultats plus que mediocre.

    Pour gerer les evenements clavier tu implementes KeyListener et ca roule.
    Les deux principales inventions sorties de Berkeley sont UNIX et le LSD. Difficile de croire à une quelconque coïncidence - Jeremy S. Anderson

    Avant de vouloir qu’un logiciel soit réutilisable, il faudrait d’abord qu’il ait été utilisable - Ralph Johnson

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup

    je vais deja essayer ca, je rééecrirait si cela ne marche pas.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    ba non, je doit pas faire ce qu'il faut parceque cela ne marche pas.

    voila mon code:
    lanceur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class testtest 
    {
    	public static void main(String arg []) 
    	{ZeldaKeyController ai = new ZeldaKeyController();}
    }
    la classe impléméntée en keyListener :
    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
     
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
     
    public class ZeldaKeyController implements KeyListener
    {
    	public test j1 = new test("mot2dbeta",100,100,800,600);
     
    	public void keyPressed(KeyEvent p)
    	{
    		if (p.getKeyChar()=='h')
    		{
    			j1.Jx = j1.Jx - 10;
    			j1.repaint();
    		}
    		else if (p.getKeyChar()=='k')
    		{
    			j1.Jx = j1.Jx + 10;
    			j1.repaint();
    		}
    		else if (p.getKeyChar()=='u')
    		{
    			j1.Jy = j1.Jy - 10;
    			j1.repaint();
    		}
    		else if (p.getKeyChar()=='j')
    		{
    			j1.Jy = j1.Jy + 10;
    			j1.repaint();
    		}
    	}
    	public void keyReleased(KeyEvent r)
    	{
    		/*if (r.getKeyChar()=='h')
    		{}
    		else if (r.getKeyChar()=='k')
    		{}
    		else if (r.getKeyChar()=='u')
    		{}
    		else if (r.getKeyChar()=='j')
    		{}*/
    	}
    	public void keyTyped(KeyEvent e)
    	{}
    }
    et la classe 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
     
    public class test extends JFrame
    {
    	private JPanel panneau = new JPanel();
    	public int Jx = 200;
    	public int Jy = 200;
    	private Image I1 = null;	
    	public test(String nom,int posx,int posy,int largeur,int hauteur)
    	{
    		super(nom);
    		setBounds(posx,posy,largeur,hauteur);
    		setResizable(false);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setContentPane(panneau);
    		setVisible(true);
    		repaint();
    		setVisible(true);
    	}
     
    	public void paint(Graphics gg)
    	{
    		Graphics2D g = (Graphics2D)gg;
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		I1 = toolkit.getImage("logo.png");
    		MediaTracker mediaTracker = new MediaTracker(this);
    		mediaTracker.addImage(I1, 0);
    		try
    		{mediaTracker.waitForID(0);}
    		catch (InterruptedException ie)
    		{System.err.println(ie);System.exit(1);}
    		g.drawImage(I1,Jx,Jy,null);	
    	}
    }
    et il faut une petite image appelée logo.png dans le meme répertoire. Le but est juste de faire en sorte que lorsque je reste appuyé sur h par exmple, l'image vas vers la gauche, et dés que je relache, elle s'arrete.
    pareille pour j,k et u.

    Pourriez vous regarder ? Ca fait un week end que je suis dessus et je vais peter un plomb

    merci d'avance
    laguna

  6. #6
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Tu as oublié d'enregistrer ton listener comme je te l'ai dit :
    Dans ta frame, tu enregistres ton listener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ZeldaKeyController zkc = new ZeldaKeyController();
    frame.addKeyListener(zkc);
    Dans ton exemple, cela donne :

    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
     
    public class testtest
    {
       public static void main(String arg [])
       {
            ZeldaKeyController ai = new ZeldaKeyController();
            ai.j1 = new test("mot2dbeta",100,100,800,600);
            j1.addKeyListener(ai);
       }
    } 
     
    public class ZeldaKeyController implements KeyListener
    {
       public test j1;
     
       public void keyPressed(KeyEvent p)
       { 
            ...
     
    }
    sinon ton listener ne reçoit jamais les évènements.

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    COOL ca marche !!!!

    Merci beaucoup benwit
    tu gére, je vais enfin pouvoir avancer.
    encore merci

    Laguna

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

Discussions similaires

  1. [Debutant] Retour à la ligne dans une boucle
    Par Boub.J dans le forum Langage
    Réponses: 10
    Dernier message: 17/08/2008, 18h41
  2. [DEBUTANT]Procédure stockée Traitement sur une boucle de requete
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/06/2007, 16h24
  3. [DEBUTANT] Changer la couleur d'une JFrame
    Par ionix dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 15/08/2006, 19h24
  4. [DEBUTANT] sortir d'une boucle avec un touche particulière
    Par thibouille dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 06h44
  5. [Debutant] Optimisation d'une boucle
    Par Javatator dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2004, 18h50

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