Stopper un applet

Stopper un applet - Java - Programmation

Marsh Posté le 16-09-2009 à 11:14:43    

Bonjour, je suis débutant en Java, et je bloque sur un exercice tiré d'un livre.
Le but du programme était à la abse d'afficher une image 2 fois, en petit et en grand. Jusque là j'ai réussi (code du livre en même temps...)
Maintenant j'ai eu envie de faire varier la taille de la seconde image 'lentement' à l'ouverture de l'applet.
A l'ouverture donc, l'image s'affiche en petit puis grandit, grandit, et... l'applet redémare.
Comment faire pour qu'une fois que l'image a atteint sa taille maxi (définie par la dernière itération de la boucle for), l'applet se stoppe mais sans se fermer ?
 
Voici le code...

Code :
  1. import java.applet.Applet;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. public class Fillmore extends Applet implements Runnable
  5. {
  6. private static final long serialVersionUID = 1L;
  7. Image pimage;
  8. Thread runner;    // Création du Thread runner.
  9. public void init()   // Initialisation de l'applet : chargement de l'image.
  10. {
  11.  pimage = getImage(getCodeBase(), "gfx/image.jpg" );
  12. }
  13. public void start()   // Instruction obligatoire quand il y a un Thread.
  14. {
  15.  if (runner==null)
  16.  {
  17.   runner = new Thread(this);
  18.   runner.start();
  19.  }
  20. }
  21. public void stop()   // Instruction obligatoire quand il y a un Thread.
  22. {
  23.  runner = null;
  24. }
  25. public void destroy()  // Instruction obligatoire quand il y a un Thread.
  26. {
  27. }
  28. void pause(int time)
  29. {
  30.  try
  31.  {
  32.   Thread.sleep(time);
  33.  } catch (InterruptedException e) { }
  34. }
  35. public void paint(Graphics screen)
  36. {
  37.  int pWidth = pimage.getWidth(this);
  38.  int pHeight = pimage.getHeight(this);
  39.  int xPos = 10;
  40.  int yPos = pHeight/4 + 20;
  41.  int vali = 1;
  42.  screen.drawImage(pimage, xPos, 10, pWidth/4, pHeight/4, this);  // Affichage à 25%, à 10px du bord en x.
  43.  screen.drawImage(pimage, xPos, yPos, 60, 60, this);     // Affichage 60*60 à 10px du bord et de l'image précédente.
  44.  // Taille variable :
  45.  xPos += (pWidth/4)+10;
  46.  if (vali==1)
  47.  {
  48.   for (int i=1;i<20;i++)
  49.   {
  50.    screen.drawImage(pimage, xPos, 10, pWidth*i/20, pHeight*i/20, this);
  51.    repaint();
  52.    pause(50);
  53.    stop();
  54.   }
  55.  }
  56.  vali=0;
  57. }
  58. public void run() {
  59.  paint(null);
  60.  stop();
  61. }
  62. }

Reply

Marsh Posté le 16-09-2009 à 11:14:43   

Reply

Marsh Posté le 17-09-2009 à 18:48:45    

Le code n'est pas correct, la méthode paint() peut être appelée à tout moment par le système et tu ne dois pas l'appeler toi-même. Vu que tu appelles repaint() dans paint() et que repaint() est un appel disant au système qu'il doit appeller paint(), paint() est appelé en boucle à l'infini, d'où ton animation en boucle.
Tu peux juste appeler repaint() pour notifier le système quand il y a un changement au niveau de l'affichage afin que celui-ci appelle paint().
 
D'autre part, il est inutile d'appeler stop() quand le traitement est fini (aussi bien dans run() que dans paint()) puisque stop() est sensé arrêter le thread mais le thread s'arrête de lui-même lorsqu'il est fini.
 
Enfin, la méthode stop() est sensée arrêter tous les threads en cours. Ici tu n'arrêtes pas le thread, tu ne fais qu'enlever sa référence mais il continue à tourner. Tu dois appeler Thread.interrupt() ou changer une variable testée régulièrement dans le thread afin d'indiquer à celui-ci qu'il doit s'arrêter.
 
Si j'ai le courage et le temps je recoderai ta classe proprement plus tard pour te montrer comment on doit coder une animation dans une Applet.

Reply

Marsh Posté le 18-09-2009 à 15:23:38    

Ok, merci pour ta réponse, j'ai compris d'où vient le problème.
Ne te casse pas la tête à essayer de refaire ça, je suis apssé à autre chose de toutes façons.

Reply

Marsh Posté le 18-09-2009 à 21:33:23    

J'avais quand même codé ça hier soir alors... Je pense que c'est quand même important car ton code est totalement erroné. C'est vrai que programmer une Applet ce n'est pas pour les débutants! Il faut savoir comment fonctionnent les threads et le cycle de vie d'une Applet.
 
Donc voilà le code d'une animation de zoom sur une image affichée au centre de l'applet:
 

Code :
  1. import java.applet.Applet;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.image.ImageObserver;
  5.  
  6. public class Fillmore extends Applet implements Runnable {
  7.  
  8.     private static final long serialVersionUID = 1L;
  9.     
  10.     private static final String    URL_IMAGE    = "gfx/image.jpg";
  11.     private static final int    ETAPES         = 40;
  12.     private static final int    DUREE_PAUSE    = 100;
  13.     
  14.     private Image image;
  15.     private int    etape;
  16.     private Thread runner = null;
  17.  
  18.     /**
  19.      * (Ré)initialise l'animation
  20.      */
  21.     public void init() {
  22.         image = getImage(getCodeBase(), URL_IMAGE);
  23.         etape = 0;
  24.     }
  25.  
  26.     public void start() {
  27.         if (runner == null) {
  28.             runner = new Thread(this);
  29.             runner.start();
  30.         }
  31.     }
  32.  
  33.     public void stop() {
  34.         if (runner != null) {
  35.             runner.interrupt();
  36.             runner = null;
  37.         }
  38.     }
  39.  
  40.     public void paint(Graphics screen) {
  41.         int w = image.getWidth(this), h = image.getHeight(this);
  42.         if ((w != -1) && (h != -1)) {
  43.             w = w * etape / ETAPES;
  44.             h = h * etape / ETAPES;
  45.             // Dessine l'image à l'échelle actuelle au centre de l'applet
  46.             screen.drawImage(image, (getWidth() - w) / 2, (getHeight() - h) / 2, w, h, this);
  47.         }
  48.     }
  49.  
  50.     public void run() {
  51.         try {
  52.             while (etape < ETAPES) {
  53.                 etape++;
  54.                 repaint();
  55.                 Thread.sleep(DUREE_PAUSE);
  56.             }
  57.         } catch (InterruptedException e) {
  58.             // Le thread a été interrompu
  59.         }
  60.     }
  61.  
  62.     @Override
  63.     public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
  64.         // Refait une tentative de dessin si les dimensions de l'image sont à présent connues
  65.         if (((infoflags & ImageObserver.WIDTH) != 0) || ((infoflags & ImageObserver.HEIGHT) != 0)) {
  66.             repaint();
  67.         }
  68.         return super.imageUpdate(img, infoflags, x, y, w, h);
  69.     }
  70. }


 
L'animation est temporairement arrêtée quand l'applet est arrêtée (stop). Elle s'exécute une seule fois, jusqu'à ce que l'applet est réinitialisée (init).


Message édité par cbeyls le 18-09-2009 à 21:33:46
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed