Java , thread keyevent entrée touche

Fermé
maher2602 - 10 août 2011 à 11:14
 maher2602 - 11 août 2011 à 12:17
Bonjour,

Je voulait savoir c'est quoi le probleme avec mon programme sachant que je veux que les o
s'affiche selon la direction (a droite ou en bas) que je tape dans le clavier.

voici le code
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Scanner;

public class aba {
public static void main(String[] args) {
ecoute e =new ecoute();
Lettre2s l2 = new Lettre2s(e);
Lettres l1 = new Lettres(l2);
l2.start();
l1.start();

}
}

class Lettres extends Thread {

Lettre2s lk;

public Lettres(Lettre2s lk) {

this.lk = lk;
}

public void run() {
while (true) {
if (lk.getdirection() == 'd')
System.out.print('o');
else if (lk.getdirection() == 'b')
System.out.println('o');
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Lettre2s extends Thread {
ecoute e;
char direction ='d';
public Lettre2s(ecoute e) {
this.e=e;
}
public void setdirection(char c){direction =c;}
public char getdirection(){return direction;}
public void run() {
while (true) {
setdirection(e.getdirection());
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
class ecoute implements KeyListener{
char direction = 'b';

ecoute (){};
public void keyTyped(KeyEvent e) {
}
public void setdirection(char dir) {
direction = dir;
}

public char getdirection() {
return direction;
}
public void keyPressed(KeyEvent e1) {
if (e1.getKeyCode() == 40) {
setdirection('b');
} else if (e1.getKeyCode() == 39) {
setdirection('d');
}
}

public void keyReleased(KeyEvent e2) {
}
}
A voir également:

1 réponse

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
10 août 2011 à 15:53
Pfiou... Y en a du ménage à faire là dedans !

Déjà gros soucis numéro 1, tu ne peux pas intercepter des évènements comme KeyListener sur la console, il te faut une interface awt ou swing pour cela !

Ensuite, l'utilisation des threads avec une attente active est totalement contraire au mode de fonctionnement des évènements !

Bref, voici une manière simple et propre de faire à peu près ce que tu veux :

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Ecoute extends JFrame implements KeyListener
{
    private static final long serialVersionUID = 1L;
    
    /**
     *  Zone de texte pour afficher un message dans la fenêtre.
     */
    private final JLabel label;
        
    /**
     * Affiche un message sur la zone de texte et la console.
     * @param msg le message à afficher
     */
    private void afficher(String msg)
    {
        System.out.println(msg);
        label.setText(msg);
    }
    
    /**
     * Une fenêtre sur laquelle on clique pour afficher la touche appuyée.
     * @param titre le titre de la fenêtre
     * @param tailleX la largeur de la fenêtre
     * @param tailleY la hauteur de la fenêtre
     */
    public Ecoute(String titre,int tailleX,int tailleY)
    {
        // Définition de la fenêtre
        setTitle(titre);
        setSize(new Dimension(tailleX,tailleY));
        setLocationByPlatform(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        // Ajout de la zone de texte
        label = new JLabel();
        add(label);
        
        // Interception des évenements clavier
        addKeyListener(this);
    }
    
    /**
     * Action à faire si une touche est pressée.
     * @param e informations sur la touche pressée
     */
    @Override
    public void keyPressed(KeyEvent e) 
    {
        switch (e.getKeyCode())
        {
        case KeyEvent.VK_DOWN :
            afficher("Bas");
            break;
        case KeyEvent.VK_LEFT :
            afficher("Gauche");
            break;
        case KeyEvent.VK_RIGHT :
            afficher("Droite");
            break;
        case KeyEvent.VK_UP :
            afficher("Haut");
            break;
        default :
            afficher("["+e.getKeyCode()+"]");
        }
    }

    /**
     * Action à faire si une touche est relachée.
     * @param e informations sur la touche relachée
     */
    @Override
    public void keyReleased(KeyEvent e) 
    {
    }

    /**
     * Action à faire si une touche tapée.
     * @param e informations sur la touche tapée
     */
    @Override
    public void keyTyped(KeyEvent e)
    {
    }
    
    /**
     * Affiche une fenêtre et les touches du clavier si on clique dessus.
     */
    public static void main(String...args)
    {
        new Ecoute("Tapez au clavier !",300,200);
    }
}
2
merci,
je suis debutant et je fait un stage dans une societe ou ils ne savent pas de quoi ils parlent en me demandant de faire des chose pas possible.
maintenant je sait que l on ne peut pas faire le truc sur la console, merci
0