Salut les zéros, c'est encore moi
Entre deux sockets, je suis en train de faire un petit tétris. J'ai un problème dans le code suivant :
package GUI;
import java.util.*;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import tetris.*;
import exceptions.*;
public class VueJeu extends JPanel implements Observer {
/**
définitions des variables et du modele ICI...
*/
public VueJeu(Modele m) {
super();
L_BRIQUE = 20;
H_BRIQUE = 20;
L_PANN = L_BRIQUE*m.NB_COL;
H_PANN = H_BRIQUE*m.NB_LIG;
super.setPreferredSize(new Dimension(L_PANN, H_PANN));
modele = m;
modele.addObserver(this);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ev) {
System.out.println("action");
}
});
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_B) {
modele.deplacerDroite();
}
System.out.println("droite");
}
});
}
...
}
Quand je clique sur le JPanel, il m'affiche "action" dans la console mais quand je presse une touche, il réagit pas... Il m'affiche même pas "droite". A votre avis d'où vient le problème ? Moi je sèche...
Merci d'avance pour votre aide
"Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
Non je ne vois vraiment pas ton code m'a l'air bon Mais peut-être que quelque-chose fait conflit dans une autre classe. Peut-être que l'ajout d'un KeyListener directement dans le constructeur fait buger? A vrai dire je n'ai jamais procédé comme ça As-tu essayé d'inverser l'ajout des listeners pour voir ? Ou voir-même de rajouter un simple "this." devant ? On ne sait jamais. Sinon au pire va dans ta classe Main (ou quel que soit son nom) et essaye au pas par pas avec le débugger
[Edit] Ah oui aussi lors de l'appui sur une touche, le bon panel n'est peut-être pas "sélectionné" si il y'en a plusieurs (je ne sais pas vraiment si ça fonctionne comme ça). Ah oui, as-tu essayé d'exporter ton programme en JAR pour le tester? Des fois que le problême vienne d'Eclipse (ou peu importe l'IDE que tu utilises)
Merci bien, j'aurais jamais trouvé ça tout seul Par contre, j'ai un autre petit problème maintenant (même si c'est pas vital). Je suis sous Ubuntu Intrepid et quand j'appuie sur des touches du clavier comme a,b etc... ça marche mais les flèches, il n'en tient pas compte. Quand j'appuie sur les flèches rien ne se passe. C'est un problème classique ça ou pas ?
"Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
Si tu réagis à keyTyped, c'est normal : il ne prend que ce qui correspond à des caractères. Non seulement il ne prendra pas les flèches, mais il ne t'enverra qu'un seul évènement contenant le caractère "û" si tu appuies sur "^" puis sur "u" par exemple.
Pour les deux autres, keyPressed et keyReleased, non, c'est pas normal. Tu devrais tout recevoir, y compris les touches comme ctrl shift ou alt tout seul, sauf peut-être la touche windows, tab, etc. (qui sont interceptés en amont)
Au pire si tu ne peux pas jouer avec les flèches, tu prévois un pavé fléché alternatif, avec par exemple les touches S (gauche), D (bas), F (droite) et E (haut), ou encore le pavé numérique (4, 6, 2, 8)
Donc je viens de regarder et même keyPressed ne prend pas les flèche. Par contre il reconnait ma touche espace. Pourtant c'est bien : KeyEvent.VK_RIGHT non ? C'est bizarre parce que j'ai trouvé un tetris en applet sur le net et lui il reconnait mes touches fléchées... Voilà mon code, il me parait pourtant pas incorrect...
vueJeu.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
try {
if (!estEnPause()) {
if (modele.estDeplacableGauche() && e.getKeyChar()== KeyEvent.VK_LEFT )
modele.deplacerGauche();
else if (modele.estDeplacableDroite() && e.getKeyChar()== KeyEvent.VK_RIGHT )
modele.deplacerDroite();
else if (modele.rotationPossible() && e.getKeyChar()== KeyEvent.VK_SPACE )
modele.rotation();
modele.notifyObservers();
}
}
catch (BriqueIncorrecte err) {
System.err.println(err.getMessage());
}
}
});
"Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
mhhhh
essaye de regarder si un evenement est déclanché quand tu pousses sur la fleches
un System.out.println(); hors du if
voir si au moins il voit qu'une touche à été enfoncée
public void keyPressed(KeyEvent e) {
System.out.println("Detectée");
try{
...
Au fait es-tu vraiment obligé d'utiliser un panel ?
Parce que tu peux également dessiner et intercepter les évènements directement sur la fenêtre ell-même. Ca pourrait peut-être simplifier les choses, à condition bien sûr que tu n'utilises aucun autre composant JButton, JTextField, etc. au quel cas ça deviendrait très compliqué au contraire.
Donc voilà, je travaillais avec netbeans et ça m'a gonflé tellement il est lent... Pire qu'un vieux word avec un document de 25 pages... Alors je suis revenu à eclipse et à la différence de netbeans (qui me disait que les keycode valait toujours 0), ma touche flèche gauche marche à condition d'utiliser getKeyCode() et non getKeyChar().
Ceci dit, c'est vous qui m'avez mis sur la voix en me disant de vérifier
Donc désolé de vous avoir monopoliser pour si peu... (je hais NetBeans maintenant... lol)
"Que par le vent, ce sera tangent". Eh ben j'ai jamais foutu les pieds dans une salle de classe, mais l'effet reste le meme ! :D
Ah forcément, si tu utilisais getKeyChar, tu ne pouvais pas savoir s'il s'agissait des flèches ou d'autre chose vu que ce type de touche ne désigne aucun caractère affichable.
keyListener n'écoute rien...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.