Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1534 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Stopper un applet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Stopper un applet

n°1924454
Profil sup​primé
Posté le 16-09-2009 à 11:14:43  answer
 

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. }

mood
Publicité
Posté le 16-09-2009 à 11:14:43  profilanswer
 

n°1924906
cbeyls
Hail to the King, Baby
Posté le 17-09-2009 à 18:48:45  profilanswer
 

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.

n°1925087
Profil sup​primé
Posté le 18-09-2009 à 15:23:38  answer
 

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.

n°1925164
cbeyls
Hail to the King, Baby
Posté le 18-09-2009 à 21:33:23  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Stopper un applet

 

Sujets relatifs
Image par dessus un applet flashPerformance d'un applet Java?
applet signée cryptographiquement et autorisationRedirection et envoi de données en POST avec applet Java
[Applet] Envoyer des images via un applet javaApplet de connexion FTP en Java
acces base de donnée via appletapplet en arriere plan
stopper la camera sous vtkApplet dans une diapo LaTeX / Beamer
Plus de sujets relatifs à : Stopper un applet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR