[Java] Dessin dans un buffer affiché par paint => problème RESOLU

Dessin dans un buffer affiché par paint => problème RESOLU [Java] - Java - Programmation

Marsh Posté le 19-02-2005 à 04:44:52    

Bonjour, j'ai un problème (de débutant ?) en Java sur lequel je m'arrache les cheveux depuis plusieurs jours.
 
J'ai des affichages un peu "lourds" (une petite image + du texte + un grand nombre de lignes) à faire et donc je voudrais dessiner tout ça dans une image à chaque fois que ça doit changer afin que la méthode paint se contente d'afficher l'image au lieu de systématiquement redessiner tout.
 
Le problème c'est que ça marche bien, SAUF au début de mon programme où, bien que je fais appel à la méthode de dessin de mon image qui appelle elle-même un repaint, mon image reste vide sauf le texte. :pt1cable:  
 
C'est pas facile à expliquer mais facile à comprendre si vous prenez la peine de télécharger le tout petit fichier ci-dessous qui contient tout les fichiers nécessaires (j'ai déjà compilé les classes donc vous n'aurez qu'à lancer "java Dessin" )
 
-> Télécharger Dessin.zip <-
 
Note : le fichier Dessin.java contient des infos supplémentaires en commentaire au tout début sur ce que doit faire le programme.
 
Merci de bien vouloir m'aider car je bloque complètement là-dessus. :cry: :jap:


Message édité par xman le 22-02-2005 à 16:35:27

---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Marsh Posté le 19-02-2005 à 04:44:52   

Reply

Marsh Posté le 19-02-2005 à 13:28:58    

Un petit up. (édité après la réponse de replix qui corrige 1 des 2 problèmes)
 
Je n'avais pas posté le code sur le forum parce que je me disais que c'était peut-être un peu long (même si c'est pas non plus énorme) mais bon, pour augmenter mes chances de réponse, le voici :
 

Code :
  1. /*
  2.   Ce programme affiche :
  3.   - une petite image en haut à gauche d'un panel ;
  4.   - une grille de pixels en bas à droite ;
  5.   - un compteur de clics en haut à droite.
  6.   Comme c'est un affichage compliqué, je le dessine dans
  7.   une image à part et c'est elle qui est affichée par la
  8.   méthode paint.
  9.   Problème que je ne comprends pas :
  10.   Comment faire pour que ça s'affiche correctement au démarrage ?
  11.   Je n'ai l'affichage voulu qu'au moment où je clique pour la
  12.   première fois alors que je dessine l'image dans le buffer dès
  13.   la construction de mon panel.
  14.   Les seuls trucs qui sontt dessinés dans mon buffer la 1ère fois
  15.   sont le compteur (du texte) et l'image (parce que j'ai mis
  16.   un media tracker). Je vais péter un cable sur ce problème !
  17. */
  18. import java.awt.*;
  19. import java.awt.event.*;
  20. import java.awt.image.*;
  21. import javax.swing.*;
  22. public class Dessin extends JPanel
  23. {
  24.   private Image petiteImage;
  25.   private BufferedImage image;
  26.   private Graphics buffer;
  27.   private Integer compteur;
  28.   // -- Constructeur --
  29.   Dessin()
  30.   {
  31.     petiteImage = getToolkit().createImage("avatar.jpg" );
  32.     try
  33.     {
  34.       MediaTracker tracker = new MediaTracker(this);
  35.       tracker.addImage(petiteImage, 0);
  36.       tracker.waitForID(0);
  37.     } catch (Exception e) {}
  38.     setPreferredSize(new Dimension(512,512));
  39.     compteur = 0;
  40.     addMouseListener
  41.     (
  42.       new MouseAdapter()
  43.       {
  44.         public void mouseClicked(MouseEvent e)
  45.         {
  46.           compteur++;
  47.           redessiner();
  48.         }
  49.       }
  50.     );
  51.     image = new BufferedImage(512,512,BufferedImage.TYPE_INT_ARGB);
  52.     buffer = image.getGraphics();
  53.     redessiner();
  54.   }
  55.   // -- Redessiner le buffer image --
  56.   public void redessiner()
  57.   {
  58.     buffer.setColor(Color.white);
  59.     buffer.fillRect(0,0, 512,512);
  60.     buffer.drawImage(petiteImage,10,10,null);
  61.     buffer.setColor(Color.black);
  62.     buffer.drawString(compteur.toString(),512-50,16);
  63.     // Dessiner une grille de pixels (j'ai fait exprès de faire un truc lent)
  64.     int i,j;
  65.     for (i=256 ; i < getWidth() ; i++)
  66.     for (j=256 ; j < getHeight(); j++)
  67.     {
  68.       if ((i+j)%2 == 0)
  69.         buffer.drawLine(i,j,i,j);
  70.     }
  71.     repaint();
  72.   }
  73.   public void paint(Graphics g)
  74.   {
  75.     g.drawImage(image,0,0,this);
  76.   }
  77.   // -- Création de l'interface graphique --
  78.   private static void creerGUI()
  79.   {
  80.     final Dessin dessin = new Dessin();
  81.     // Création de la fenetre dans laquelle on integre notre programme
  82.     JFrame frame = new JFrame("Dessin" );
  83.     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  84.     frame.setContentPane(dessin);
  85.     frame.setResizable(false);
  86.     frame.pack();
  87.     frame.setVisible(true);
  88.   }
  89.   // Au lancement, on crée la GUI qui va instancier et lancer le programme
  90.   public static void main(String[] args)
  91.   {
  92.     javax.swing.SwingUtilities.invokeLater
  93.     (
  94.       new Runnable() { public void run() { creerGUI(); } }
  95.     );
  96.   }
  97. }


 
 
Si vous voyez des erreurs / trucs qu'il faudrait faire autrement, dites-moi, je débute et suis désireux d'apprendre. :jap:


Message édité par xman le 22-02-2005 à 15:06:46

---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Marsh Posté le 21-02-2005 à 09:46:34    

Ajoute ceci :

Code :
  1. petiteImage = getToolkit().createImage("avatar.jpg" );
  2.         try {
  3.             MediaTracker tracker = new MediaTracker(this);
  4.             tracker.addImage(petiteImage, 0);
  5.             tracker.waitForID(0);
  6.         } catch (Exception e) {
  7.         }


 
Le MediaTracker veille à ce que l'image soit entièrement chargée avant de passer à la suite.


---------------
Gestion de bug en mode ASP/java : http://eap.bug-sweeper.fr
Reply

Marsh Posté le 21-02-2005 à 14:19:35    

MERCI !!! Ca marche !
Tu m'enlève une sacrée épine du pied ! :jap:
 
-----
EDIT : argh ! En fait, ça ne marche qu'à moitié. :(
L'image est bien chargée à temps pour être affichée dans mon image "buffer" MAIS la grille de pixels que je veux également dessiner ne s'affiche pas. :pt1cable:  
-----

 
 
Je ne suis toutefois pas certain de comprendre pouquoi je suis obligé d'insérer ça dans un try mais bon, c'est pas bien grave.
 
D'autre part, si je souhaite charger plusieurs images, je ne sais pas trop si je dois faire ceci :

Code :
  1. tracker.addImage(image1, 0);
  2. tracker.addImage(image2, 0);
  3. tracker.waitForID(0);


ou ceci :

Code :
  1. tracker.addImage(image1, 0);
  2. tracker.waitForID(0);
  3. tracker.addImage(image2, 1);
  4. tracker.waitForID(1);


 
J'ai l'impression que ça revient au même à part que la première solution a des chances d'être plus rapide mais je ne sais pas si j'extrapole bien. :??:


Message édité par xman le 21-02-2005 à 14:34:31

---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Marsh Posté le 22-02-2005 à 16:34:51    

Ca y est j'ai trouvé mon dernier problème !! ouf !
Dans le dessin de ma grille, je faisais appel à getWidth et getHeight alors qu'ils renvoient encore 0 tant que mon application n'a pas été affichée.
J'ai remplacé par des constantes et c'est bon.


Message édité par xman le 22-02-2005 à 16:49:14

---------------
Bon, puisque presque tout le monde a une signature, ben moi aussi ! Na !
Reply

Sujets relatifs:

Leave a Replay

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