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

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°986868
xman
branleur
Posté le 19-02-2005 à 04:44:52  profilanswer
 

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 !
mood
Publicité
Posté le 19-02-2005 à 04:44:52  profilanswer
 

n°987017
xman
branleur
Posté le 19-02-2005 à 13:28:58  profilanswer
 

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 !
n°988080
replix
Posté le 21-02-2005 à 09:46:34  profilanswer
 

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
n°988450
xman
branleur
Posté le 21-02-2005 à 14:19:35  profilanswer
 

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 !
n°990075
xman
branleur
Posté le 22-02-2005 à 16:34:51  profilanswer
 

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 !

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

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

 

Sujets relatifs
[debutant] tableau javaJava SWT
[Résolu !] liste déroulante dépendante (valeur non gardée)[Brainstorming] Communication entre Programme C & Java
Problème ensemble d'exploration (TDriveCombobox, TDirectoryListBox...)[C#/VB.NET] [Résolu] Equivalent de GetObject ?
Probleme html très facile a résoudre (mais je trouve pas snif)probleme de code
Probleme de structureProblème de reception socket
Plus de sujets relatifs à : [Java] Dessin dans un buffer affiché par paint => problème RESOLU


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