KeyListener et Runnable dans la même classe

guitoucode Messages postés 3 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 16 décembre 2010 - 15 déc. 2010 à 15:53
guitoucode Messages postés 3 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 16 décembre 2010 - 16 déc. 2010 à 09:31
Bonjour,

voici mon problème: J'ai crée une classe qui implémente( c'est encore un peu flou pour moi) Runnable(pour la création de Thread) et KeyListenet(pour la gestion des touches du clavier, notamment les fleches)

voici la classe pour la gestion des touches:
import javax.swing.*;
import java.awt.event.*;

public class Touche  extends JPanel implements KeyListener,Runnable{

 public Touche(){
setFocusable(true);
addKeyListener(this);
System.out.println("Touche construit");
 }
 
 public void keyTyped(KeyEvent g) {}

    public void keyPressed(KeyEvent g) {
if(g.getKeyCode()==KeyEvent.VK_DOWN) {
    System.out.println("touche DOWN");
}

if(g.getKeyCode()==KeyEvent.VK_ESCAPE) {
System.exit(0);
}
    }

public void keyReleased(KeyEvent g) {
// TODO Auto-generated method stub
}

public void run() {
// TODO Auto-generated method stub
for(;;) {
System.out.println("run de Touche");
 try {
                     	Thread.sleep(1000);
 	} catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
 	}
}
}
}

Le problème est que KeyListener impose d'avoir trois méthode dans la classe: keyReleased,keyTyped et keyPressed.
Et runnable impose la méthode Run() pour savoir ce qui est exécuté dans le thread.

Mon thread est bien bien crée, mais le clavier n'est pas vu par la classe Touche.

Comment faire pour avoir la gestion du clavier par KeyListener en Thread.?
voici mon main:
public static void main(String[] args) {
System.out.println("Le nom du thread principal est " + Thread.currentThread().getName());
Thread cp1 = new Thread(new Touche());
cp1.start();
}

4 réponses

Utilisateur anonyme
15 déc. 2010 à 16:22
Bonjour

Tu ne peux pas utiliser un KeyListener comme ça, il faut le mettre sur un composant AWT ou Swing en appelant la méthode addKeyListener(). Utilise plutôt la classe Scanner si tu veux lire les entrées au clavier.

Si tu cherches à écrire un key logger, ce n'est pas l'endroit pour poser ce genre de question.















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
guitoucode Messages postés 3 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 16 décembre 2010
15 déc. 2010 à 16:34
salut,
merci pour la réponse.
Merci pour le mot KeyLogger, je ne connaissais même pas. Mais non, mon intention n'est pas vil. Mon projet est un peu plus grand que ça, j'aimerai contrôler un objet dans une fenêtre avec les touches "flèches" du clavier.


La classe fonctionne très bien si on retire tout ce qui est Thread. C'est en ajoutant la gestion des Thread que ça coince. Et là il y a la méthode addKeyListener() dans la classe Touche(). Ce que je demande c'est qu'elle est la méthode pour avoir une classe qui gere le clavier(les fleches ds mon cas) et qui sit exécutée dans un thread. Un thread afin que le clavier soit tout le temps scanner, en parallèle par exemple de l'affichage de mon objet que je veux faire bouger dans une fenêtre.

voila, j'essayes de faire ça pour appliquer ce que je lis et mieux comprendre JAVA.

MErci d'avance.
0
Utilisateur anonyme
15 déc. 2010 à 20:01
Le problème ne vient pas des Threads mais de ta façon de t'en servir. En fait, tu n'as pas besoin d'utiliser un Thread séparé pour scanner le clavier en permanence, c'est totalement inutile. J'ai écrit plusieurs jeux vidéo en Java, je sais de quoi je parle. Pourquoi ne pas mettre simplement ton KeyListener soit sur ton JPanel soit sur ta JFrame? Là, avec ce que tu fais, tu bloques l'Event Dispatching Thread, tu n'exécutes rien sur un nouveau Thread. Si tu voulais vraiment créer un Thread à part et exécuter une tâche dessus, il faudrait faire un truc de ce genre :

new Thread(new Runnable(){
    @Override
    public void run(){
        //ton code
    }
}).start();


mais à mon avis, ce n'est pas la bonne approche. Bon courage.

















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
guitoucode Messages postés 3 Date d'inscription lundi 13 décembre 2010 Statut Membre Dernière intervention 16 décembre 2010
16 déc. 2010 à 09:31
Merci bien, ca fonctionne sans Thread.
J'étais persuadé qu'il faille un thread pour évité de bloquer.
0
Rejoignez-nous