Java , thread keyevent entrée touche
maher2602
-
maher2602 -
maher2602 -
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) {
}
}
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) {
}
}
1 réponse
-
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); } }