Problème avec KeyTyped de KeyListener

CdB2006 Messages postés 41 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 25 janvier 2012 - 21 janv. 2012 à 19:44
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012 - 27 janv. 2012 à 14:41
Bonjour, j'essaye de faire bouger un rectangle dans un JPanel à l'aide de l'interface KeyListener, j'y arrive tout à fait bien avec la méthode KeyPressed (faire bouger le rectangle tant que je reste appuyé) malheureusement le faire se déplacer dans mon JPanel jusqu'à un certain point quand j'appuye sur une touche avec la méthode KeyTyped ne fonctionne pas, l'objet reste sur place jusqu'à la fin de ma boucle puis disparait puis réaparait à l'endroit final, mais on ne voit pas le déplacement. pourriez-vous m'aider sil-vous plait? Voilà ma méthode KeyTyped :

public void keyTyped(KeyEvent e) {


if(e.getKeyChar() == 'd')
{
int x = panel.getPosX();
int y = panel.getPosY();

long time;

for (;x <= 650; x++, y++)
{
time = System.currentTimeMillis();
while(System.currentTimeMillis() - time < 10)
{
Thread.yield();
}
panel.setPosX(x);
panel.setPosY(y);
panel.repaint();

}
}


}

8 réponses

dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
25 janv. 2012 à 10:40
Salut,
Il y a quelques temps, j'ai travaillé sur ce problème.
Je l'ai résolu en utilisant une classe spécifique qui va permettre de fluidifier ton animation via à une mémoire tampon (BufferedImage).

J'ai malheureusement oublié toutes les étapes à suivre afin d'afficher correctement tout ça dans le panel mais je pense qu'avec le code ci-dessous, tu arriveras rapidement à un résultat.

static BufferedImage img= getBufferedImageFromFile("tonImage.jpg");


public static BufferedImage getBufferedImageFromImage(Image img){
        BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bufferedImage.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return bufferedImage;
}


Remarque: j'ai utilisé la méthode paintComponent pour le dessin, elle est LA méthode de dessin dans la librairie SWING (entre autres pour utiliser toutes les possibilités du graphisme de Java 2 en convertissant l'objet Graphics en Graphics2D)
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
25 janv. 2012 à 10:43
Cette fonction est plus appropriée :-)

public static BufferedImage getBufferedImageFromFile(String fileName){
        Image img;
 	img = new ImageIcon(fileName).getImage();
        BufferedImage bufferedImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bufferedImage.createGraphics();
        g.drawImage(img, 0, 0, null);
        g.dispose();
        return bufferedImage;
}
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
25 janv. 2012 à 10:52
En fait après il te suffit de surcharger paintComponent et de dessiner ton BufferedImage

@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(Img,x,y,width,height,this);
}


Je me souviens avoir mis, à l'époque quelque temps pour découvrir tout ça.
Je pense que ça peut servir, si c résolu fait le savoir à la communauté
0
CdB2006 Messages postés 41 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 25 janvier 2012
25 janv. 2012 à 16:39
Quelle est ta variable img ici ? j'ai essayé avec le bufferedImage et il me met cette exception :
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)

Ensuite affiche mon panel mais tout blanc puis il deviens tout noir..


@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(Img,x,y,width,height,this);
}


Sais tu pourquoi? j'utilise une image jpg
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CdB2006 Messages postés 41 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 25 janvier 2012
25 janv. 2012 à 16:55
Celà ne fonctionne pas avec BufferedImage, l'objet disparait aussi durant tout son trajet, je ne comprends pas pourquoi ce là ne fonctionne pas avec KeyTyped, alors que si j'appelle la méthode de déplacement hors de keyTyped, celà fonctionne sans problème...
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
26 janv. 2012 à 10:47
Salut,
Sorry, j'ai cru que tu parlais de problème de clignotement lors de l'animation. Mon explication était pour une étape supérieur.
En fait, ton problème est basique, tu dois changer ton algorithme de déplacement, et c tout

Tu déclares 2 variables pour le déplacement
int x,y = 0;

Puis tu lui demandes de se déplacer 3 pixels par 3 pixels(par exemple)
if(e.getKeyChar() == 'd')
{
x = x+3;
y = y+3;
}
repaint();

A chaque fois que tu appelera repaint(), il affichera un rectangle (par exemple) avec les nouvelles valeurs entrées lors de l'appel de la méthode keyTyped
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.fillRect(x, y, 50, 50);
}

L'évenement est déclenché à chaque fois que tu appuies sur la touche donc pas besoin de boucle for ou while pour l'animer
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
26 janv. 2012 à 11:06
Sorry, je vois que j'ai pas encore bien lu (décidemment mdr)

Si tu veux l'animer sans rester appuié, tu dois utiliser un thread qui sera déclenché lorsque tu appuies sur la touche. Tu dois implémenter l'interface Runnable dans ta classe.
N'oublie pas que lorsque tu rappuies sur la touche; il faut regarder s'il le thread existe(!=null) ou est déjà lancé.
public void startThread(){
    if (threadAnim==null){threadAnim = new Thread(this);threadAnim.start();}
}

Dans ce thread tu fait juste un déplacement de 3pixels (par exemple) comme je te l'ai expliqué au-dessus puis tu appeles la méthode repaint().

public void run(){
while(x<650){
x = x+3;
y = y+3;
try{
        Thread.sleep(10);
    }catch(Exception e){}
repaint();
}

}

Voilà, mtn je pense que j'ai vraiment répondu à ta question :p
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
27 janv. 2012 à 14:41
Alors, t'arrives à quelque chose?
0
Rejoignez-nous