Bonjour,
j'essaye de faire un petit programme tout simple, dans lequel un Jpanel possède une image de fond, et un gif transparent se balade dedans, lorsque je clique sur la souris (n'importe ou pour l'instant) j'aimerai qu'un second sprite s'ajoute à l'écran. Le sprite s'ajoute effectivement MAIS aprés avoir RE-cliquer pour "défreezer" l'animation qui ne se raffraichie pas mais continue à tourner en arrière plan!... Il doit y avoir un problème au niveau du Thread, mais je vois pas du tout lequel.
POuvez vous me dire d'ou ce freeze provient? Merci!
Les sources et .class :
[ Lien ]
le code du JPanel:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
public class BouncePanel extends JPanel implements Runnable {
Image bidou, fond, bisou;
float current = 0F;
Thread runner;
int xPosition = 10;
int xMove = 5;
int yPosition = 1;
int bidouHeight = 158;
int bidouWidth = 110;
int height;
ArrayList BisousTab = new ArrayList();
public BouncePanel() {
super();
Toolkit kit = Toolkit.getDefaultToolkit();
bidou = kit.getImage("bidou.gif");
fond = kit.getImage("fond.jpg" );
bisou = kit.getImage("bisou.gif");
this.addMouseListener(new AnimMouseAction() );
runner = new Thread( this );
runner.start();
}
public void paintComponent(Graphics comp) {
Graphics2D comp2D = (Graphics2D) comp;
height = getSize().height - bidouHeight-20;
if (yPosition == -1)
yPosition = height - 20;
if ((fond != null) && (bidou != null) ) {
comp2D.drawImage(fond,0,0,this);
Iterator it = BisousTab.iterator ( ) ;
while ( it . hasNext ( ) ) {
comp2D.drawImage(bisou,(int) ( (( Bisou ) (it.next())).x), (int) ( (( Bisou ) (it.next())).y), this);
}
comp2D.drawImage(bidou,(int) xPosition, (int) yPosition, this);
}
}
public void run() {
Thread thisThread = Thread.currentThread();
while (runner == thisThread) {
current += (float) 0.1;
if ( current > 3)
current = (float) 0;
xPosition += xMove;
if (xPosition > (getSize().width - bidouWidth))
xMove *= -1;
if (xPosition < 1)
xMove *= -1;
double bounce = Math.sin(current) * height;
yPosition = (int) (height - bounce);
repaint();
try {
Thread.sleep(30);
} catch ( InterruptedException e) {}
}
}
class AnimMouseAction extends MouseAdapter {
public void mousePressed(MouseEvent e) {
//if ( runner != null) runner = null;
BisousTab.add( new Bisou ( xPosition, yPosition));
}
}
class Bisou {
public int x;
public int y;
public Bisou(int x, int y) {
this.x = x;
this.y = y;
}
}
}
PS: Oui, c'est un programme niais 