Comment intercepter les touches du clavier

maher2626 Messages postés 13 Statut Membre -  
maher2626 Messages postés 13 Statut Membre -
Bonjour,

Je fait programme ou je doit executer des taches en meme temps d'ou l utilisation de threads. une des tache consiste en l'interception des touches du clavier .
pouvez -vous m'indiquer comment? ou ce qui ne va pas avec mon code?

voici mon code:

public class direction extends JFrame implements KeyListener, Runnable {
private int direct = 1;

public void direction() {
addKeyListener(this);
}

public void keyPressed(KeyEvent arg0) {
}

public void keyReleased(KeyEvent arg0) {
}

public void keyTyped(KeyEvent e) {
int ver = 1;
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
ver = 3;
System.out.println("en bas");
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
ver = 4;
System.out.println("a gauche");
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
ver = 2;
System.out.println("en haut");
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
ver = 1;
System.out.println("a droite");
}
if (!((ver + direct) == 5))
direct = ver;

}

public int getdirection() {
return direct;
}

public void run() {

System.out.println(direct);
}
}
A voir également:

1 réponse

KX Messages postés 19031 Statut Modérateur 3 020
 
Tu dois te servir de KeyPressed et non pas KeyReleased.
De plus j'émets de grosses réserves quant à l'implémentation de Runnable :

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

import javax.swing.JFrame;

public class Direction extends JFrame implements KeyListener
{
	private static final long serialVersionUID = 1L;
	
	private int direct = 1;
	
	public Direction() 
	{
		addKeyListener(this);
	}
	
	public int getdirection()
	{
		return direct;
	}
	
	@Override
	public void keyPressed(KeyEvent e) 
	{
		int ver = 1;
		
		switch (e.getKeyCode())
		{
		case KeyEvent.VK_DOWN :
			ver = 3;
			System.out.println("en bas");
			break;
		case KeyEvent.VK_LEFT :
			ver = 4;
			System.out.println("a gauche");
			break;
		case KeyEvent.VK_UP :
			ver = 2;
			System.out.println("en haut");
			break;
		case KeyEvent.VK_RIGHT :
			ver = 1;
			System.out.println("a droite");
			break;
		default :
			System.out.println(e.getKeyCode());
		}
		
		if (ver+direct!=5)
			direct = ver;
	}

	@Override
	public void keyReleased(KeyEvent e) {
	}

	@Override
	public void keyTyped(KeyEvent e) 
	{		
	}
	
	public static void main(String...args)
	{
		new Direction().setVisible(true);
	}
}
1
maher2626 Messages postés 13 Statut Membre
 
desole tu repond pas du tout a la question
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Alors reformule ta question ! En quoi ma réponse est-elle si éloignée de ce que tu veux ? Après tout j'ai juste repris ton code en le modifiant de sorte qu'il fonctionne...
0
maher2626 Messages postés 13 Statut Membre
 
moi ce que je veux c'est utiliser ma détection du clavier dans un thread puisque mon but et de faire en sorte par exemple que mon programme lit les touches du clavier et en parallèle qu'il dessine.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
La gestion des évènements est déjà géré par des threads, donc ce code fait déjà ce qu'il faut.
As-tu au moins testé le code que j'ai mis ? Il lance une fenêtre, et lorsqu'on appuie dessus avec les flèches haut, bas... il affiche dans la console haut, bas... C'est exactement ce que tu voulais faire dans le code que tu nous as donné, à part que toi ça ne marchait pas et moi si !
Je n'ai rien fait d'autre que corriger ton code, en effet KeyTyped dont tu te servais ne reconnais pas les flèches contrairement à KeyPressed qui lui les reconnait. Et mettre des threads alors que c'en est déjà est évidemment inutile,d'autant que ça risque de les court-circuiter !
0
maher2626 Messages postés 13 Statut Membre
 
j'ai essayer d'utiliser KeyPressed comme tu me la dit mais ca ne marche pas dans mon code le voici


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JApplet;


public class snakeapplet extends JApplet implements KeyListener{
private corp[] serp = new corp[2400];
private corp pomme;
private int nbpoints;
private corp queue;
private int direct = 1;
public void init(){
addKeyListener(this);
this.setSize(410, 410);
addKeyListener(this);
pomme = new corp((((int) (Math.random() * 100000)) % 39) + 1,
(((int) (Math.random() * 100000)) % 39) + 1);
serp[0] = new corp(10, 15);
nbpoints = 0;
queue = serp[0];
}
public void prochaintour() {
queue = serp[nbpoints];
for (int i = nbpoints + 1; i > 0; i--) {
serp[i] = serp[i - 1];
}
if (direct == 1)
serp[0].setx(serp[0].getx() + 1);
else if (direct == 4)
serp[0].setx(serp[0].getx() - 1);
else if (direct == 2)
serp[0].sety(serp[0].getx() + 1);
else if (direct == 3)
serp[0].sety(serp[0].getx() - 1);
mangepomme();
}


public void paint(Graphics g) {

g.clearRect(10, 10, 390, 390);

Image imge;

imge = getToolkit().getImage("pomme.gif");
g.setColor(Color.BLACK);
for (int i = 1; i < 40; i++) {
g.fillRoundRect(i * 10, 0, 10, 10, 4, 4);
g.fillRoundRect(i * 10, 400, 10, 10, 4, 4);
g.fillRoundRect(0, i * 10, 10, 10, 4, 4);
g.fillRoundRect(400, i * 10, 10, 10, 4, 4);
}
System.out.println(nbpoints);

g.drawImage(imge, pomme.getx()*10, pomme.gety()*10, 10, 10, this);
g.setColor(Color.GREEN);
g.fillOval(serp[0].getx() * 10, serp[0].gety() * 10, 10, 10);
for (int i = 1; i < nbpoints + 1; i++) {
g.fillRect(serp[i].getx() * 10, serp[i].gety() * 10, 10, 10);
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
prochaintour();
if (verification() == true){
repaint();
}
}
public void keyPressed(KeyEvent e) {
System.out.println("kk");
int ver = 1;
if (e.getKeyCode() == KeyEvent.VK_DOWN)
ver = 3;
else if (e.getKeyCode() == KeyEvent.VK_LEFT)
ver = 4;
else if (e.getKeyCode() == KeyEvent.VK_UP)
ver = 2;
else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
ver = 1;

if (!((ver + direct) == 5))
direct = ver;
}

public void keyReleased(KeyEvent arg0) {
}

public void keyTyped(KeyEvent e) {

}
public boolean verification() {
for (int i = 1; i < (nbpoints + 1); i++) {
if (serp[0].equals(serp[i]))
return false;
}
if (serp[0].getx() == 0 || serp[0].getx() == 40 || serp[0].gety() == 0
|| serp[0].gety() == 40)
return false;
return true;
}

public void mangepomme() {
if (serp[0].equals(pomme))
{
System.out.println("====================");
nbpoints++;

pomme = new corp((((int) (Math.random() * 100000)) % 38) + 1,
(((int) (Math.random() * 100000)) % 38) + 1);
serp[nbpoints] = queue;
queue = serp[nbpoints];
}
}
}
0