Problème avec KeyTyped de KeyListener

Signaler
Messages postés
41
Date d'inscription
jeudi 20 août 2009
Statut
Membre
Dernière intervention
25 janvier 2012
-
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
-
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();

}
}


}
A voir également:

8 réponses

Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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)
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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;
}
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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é
Messages postés
41
Date d'inscription
jeudi 20 août 2009
Statut
Membre
Dernière intervention
25 janvier 2012

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
Messages postés
41
Date d'inscription
jeudi 20 août 2009
Statut
Membre
Dernière intervention
25 janvier 2012

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...
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

Alors, t'arrives à quelque chose?