Faire une attente entre 2 affichage d'image - Java - Programmation
Marsh Posté le 20-02-2006 à 17:07:41
Ouai mais je prefererais utiliser une succession d'images (5 ou 6) pour faire une ptite animation basique.
Marsh Posté le 21-02-2006 à 10:49:35
humm, bizarre....
g est bien le Graphics du paint(Graphics g) ?
essais avec un getContentPane().getGraphics().drawImage(...) (en supposant que c'est dans une JFrame et non une applet )
Sinon, dans la doc sur DrawImage, il y'a :
This method returns immediately in all cases, even if the complete image has not yet been loaded, and it has not been dithered and converted for the current output device.
If the image has not yet been completely loaded, then drawImage returns false. As more of the image becomes available, the process that draws the image notifies the specified image observer.
essais avec un sleep() plus elevé pour voir si il peut afficher les 2 images l'une apres l'autre..
...Nous ne voyons pas d'autre explication...
Marsh Posté le 21-02-2006 à 11:32:53
osok a écrit : |
En fait si c'est comme sous windows, le drawimage ne dessine pas vraiment l'image dans la fenetre immediatement.
L'image est dessinée pendant un evenement du style onPaint() de la fenetre. Comme il y a 2 images succesives, tu ne vois que la derniere.
Il faudrait que tu fasse:
drawimage(1...)
UpdateWindows()->Cherche dans la doc de la classe fenetre pour trouver la methode correcte, methode qui fait se redessiner la fenetre.
wait()
drawimage(2...)
wait() etc.
Cela dit une methode plus correcte serait de
1-Creer un timer qui fait se redessiner la fenetre
2- Dans la methode onpaint de la fenetre tu dessine 1 seule image. le nom de fichier est dans un tableau dont l'indice change a chaque appel, comme ca l'image change a chaque appel.
(Cela dit il y a longtemps que je n'ai pas fait de java, donc surtout consulter la doc pour trouver les fonctions correctes dont je parle)
Marsh Posté le 21-02-2006 à 19:26:21
class MaFenetre extends JFrame{
private JPanel pan;
MaFenetre(){
setTitle("essai" );
setSize(800,500);
pan=new Paneau();
getContentPane().add(pan);
}
}
class Paneau extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage((new ImageIcon("1.gif" )).getImage(),200,200,null);
g.drawImage((new ImageIcon("2.gif" )).getImage(),200,200,null);
g.drawImage((new ImageIcon("3.gif" )).getImage(),00,200,null);
}
}
public class PremTxt {
public static void main (String args[]){
MaFenetre fen=new MaFenetre();
fen.setVisible(true);
}
}
Marsh Posté le 21-02-2006 à 19:31:54
Voilà mon pti bout de programme (dsl pour l'indentation).
Apparament il fait que je fasse un update (de la classe JFrame) mais le probleme c'est que la methode paintComponent est appelé "indirectement" par getContentPane() donc je peux pas passer la fenetre en parametre.
En fait je voudrais juste (pour tester) créer une fenetre puis d'afficher plusieurs images à la suite les unes des autres (avec un pti wait entre chaque image histoire de voir une mini animation).
Mais petit probleme je sais pas comment m'y prendre... Donc si vous pouviez m'aider c'est juste pour voir comment je pourrais faire une animation.
Merci.
Marsh Posté le 21-02-2006 à 23:56:26
Salut,
c'est pas exactement comme ca que tu dois t'y prendre.
La methode paint() affiche appres ce que tu lui as dit d'afficher dedans.
En fait pour tes trois images successives, tu dois faire 3 appels a repaint() en changeant la valeur du nom de l'image a afficher. en gros ca donnerait:
Code :
|
et eventuellement dans une boucle while() pour faire une animation.
Bon courage
EDIT: c'est peut-etre update au lieu de repaint, faut verifier les apis
Marsh Posté le 22-02-2006 à 14:01:53
essai plutot de faire un
this.setContentPane(Paneau); histoire que paneau soit le panel principal ( du moins pour tester )
et essai de redefinir le paint(g) de MaFenetre :
public void paint(Graphics g)
{
mets les drawImages ici
}
En fait, la methode paintComponent doit etre appelé pour chaque composant du panel principal, et le resultat doit etre visible qu'a la fin de cette boucle donc ça t'affiche que la derniere image.
ça devrait marché avec ce que je te dis...
Marsh Posté le 22-02-2006 à 14:07:07
Sinon, sur le meme principe que wapcamer,
dans ton Paneau, tu peux mettre un tableau d'Image et une variable compteur (int).
Ensuite dans paintComponent() du paneau, tu fais compteur++, et du affiche l'image qui correspond au compteur.
Le probleme c'est que tu ne maitrise pas les appels à paintComponent , alors l'animation n'aura pas un bon timing...
( sauf si dans MaFenetre tu appel repaint() en boucle avec un sleep() )
Marsh Posté le 22-02-2006 à 23:19:22
Merci beaucoup je vais tester ca dès demain (dure journée aujourd'hui lol) et je vous tiens au courant.
Marsh Posté le 24-02-2006 à 22:59:22
Arf apparament j'ai pas trop compris le fonctionnement de l'affichage d'une image.
Il sert à quoi le paneau en fait??? Et la methode paintComponent elle est appelé quand???
Marsh Posté le 26-02-2006 à 13:55:45
et pourquoi pas faire un thread qui change l'image courante a affiché ?
Marsh Posté le 19-02-2006 à 22:38:08
g.drawImage((new ImageIcon("0.gif" )).getImage(),200,200,null);
g.drawImage((new ImageIcon("1.gif" )).getImage(),200,200,null);
J'aimerais faire une pti tps d'attente entre les 2 affichages d'image (qui sont superposés) pour faire une sorte de ptite animation. Probleme quand je met un wait entre les 2 instructions, le prog fait bien un tps d'attente mais avant d'afficher la premiere image. Ce qui fait qu'il attend puis affiche les images donc on ne voit que la derniere image afficher.
Donc j'aurais voulu savoir comment faire pour avoir un tps d'attente qui me permettrais de voir la premiere image pendant par exemple 0,5s et de pouvoir realiser une mini animation.
Merci à tous.