IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Invocation de la méthode ImageObserver.imageUpdate


Sujet :

2D Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut Invocation de la méthode ImageObserver.imageUpdate
    Bonjour !

    Ayant déjà une certaine expérience en Java, mais PAS en interfaces AWT/Swing, mes débuts sont assez laborieux, et je vous prie de m'excuser par avance pour l'éventuelle stupidité de mes questions

    Voilà : j'ai écrit un composant (une classe héritée de JPanel, pour ne pas la nommer), sur lequel j'affiche une image que j'ai générée à coups de fonctions de dessin (drawLine(), fill(), tout ça... pas d'import) en utilisant le double-buffering. Je souhaite pouvoir faire invoquer une méthode au moment où l'image aura fini d'apparaître à l'écran. Ma tentative en termes de code ressemble à ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package com.ddd.schema.applet;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.event.MouseListener;
    import java.awt.font.TextLayout;
    import java.awt.image.BufferedImage;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.regex.Pattern;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    //Divers imports
     
    class PanelGrapheLineaire extends JPanel {
            private static final long serialVersionUID = 1L;
     
            protected BufferedImage graphe;
            protected Graphics2D bufferGraphe;
            protected boolean grapheGenere;
     
            //Constructeur et autres méthodes
     
            protected void genereGraphe() {
                    this.graphe = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
                    this.bufferGraphe = this.graphe.createGraphics();
     
                    // Dessin dans this.bufferGraphe
     
                    this.grapheGenere = true;
            }
     
            public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
                    System.out.println("ImageUpdate : PanelGrapheLineaire");
                    boolean ret = super.imageUpdate(img, infoflags, x, y, w, h);
                    if (ret && this.grapheGenere) {
                            // Invocation souhaitée en cas d'image complètement affichée
                    }
                    return ret;
            }
     
            protected void paintComponent(Graphics g) {
                    System.out.println("PaintComponent : PanelGrapheLineaire, l=" + this.getWidth() + ", h=" + this.getHeight());
     
                    if (!this.grapheGenere) {// Si première génération, on crée l'image
                            this.genereGraphe();
                    }
     
                    ((Graphics2D) g).setBackground(this.getBackground());
                    g.clearRect(0, 0, this.getWidth(), this.getHeight());
                    this.prepareImage(this.graphe, this.getWidth(), this.getHeight(), this);
                    g.drawImage(this.graphe, 0, 0, this);
     
                    System.out.println("PaintComponent : PanelGrapheLineaire DONE");
            }
    }
    Problème : en traçant un peu l'exécution de l'affichage de ce composant et du dessin, je constate que la méthode imageUpdate() n'est jamais appelée...

    Aurais-je par hasard fait un oubli ? Une erreur grossière ? Fait complètement fausse route ?

    Toute réponse éclairée et éclairante sera grandement appréciée ! Merci d'avance !

    Bien à vous.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 857
    Points
    22 857
    Billets dans le blog
    51
    Par défaut
    Etant donne que ton image est deja entierement realisee lorsque tu la dessines sur l'ecran il me semble tout a fait normal que cette methode ne soit jamais appellee.
    D'autant plus que tu ne generes pas non-plus l'evenement en question.

    Actuellement ton image est entiererement creee dans l'EDT et affichee immediatement apres, les deux traitement ne se chevauchent donc jamais.

    Bref, si tu veux reellement recevoir cet evement, il te faut probablement creer le contenu de ton image dans une autre thread et de lever l'evenement appropie a la fin du rendu.

    Et, heu... a quoi cela te sert-il d'appeler prepareImage() etant donne que c'est toi-meme qui genere ton image dans genereGraphe() ?
    Basiquement cette methode sert a telecharger le contenu d'une Image (du genre de celles generees par Toolkit) en tache de fond. Or tu utilises une BufferedImage qui est deja integralement en memoire : il n'y aura jamais de telechargements.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Ça a du sens, en effet ! Merci beaucoup ! Ne me reste plus qu'à trouver comment détecter la fin du rendu...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur lors de l'invocation d'une méthode
    Par Rony Rauzduel dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2013, 15h19
  2. Réponses: 3
    Dernier message: 19/01/2013, 13h33
  3. Invocation dynamique de méthodes
    Par Snyper dans le forum Struts 2
    Réponses: 1
    Dernier message: 11/01/2012, 12h25
  4. Réponses: 13
    Dernier message: 26/06/2009, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo