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

Interfaces Graphiques en Java Discussion :

Image qui ne s'affiche qu'au redimensionnement


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Par défaut Image qui ne s'affiche qu'au redimensionnement
    Bonjour, presque bonsoir,

    Voila j'ai une image en fond de JFrame, mais elle ne s'affiche que si je redimensionne la JFrame. C'est contrariant...

    J'ai bidouillé un truc avec des repaint et un ComponentListener, mais ça ne me semble pas très propre.

    J'ai ajouté l'image de façon classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public void paint(Graphics g) {
     
     
            g.drawImage(img, 0, 18, 200, 35, null);
            g.dispose();
        }
    Une idée sur la cause du problème?

    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Comment charges-tu ton image ? Si c'est avec Toolkit, tu dois utiliser le mecanisme d'ImageObserver pour etre notifie de la fin du chargement de l'image en arriere-plan de maniere a rafraichir ton interface.
    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 chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Par défaut
    Non je n'utilse pas le Toolkit...Mais j'ai régler le problème avec un simple repaint. Je n'explique pas pourquoi mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paint(Graphics g) {
     
     
            g.drawImage(img, 0, 18, 200, 35, null);
            repaint();
            g.dispose();
        }
    marche à merveille...
    Et finalement tant mieux ça marche et je cherche pas à comprendre

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Arf, ca m'apprendra a lire le code de maniere plus detaille meme s'il ne fait que 4 lignes :

    - tu ne DOIS PAS faire dispose() sur le Graphics passe en parametre la methode paint() (ou paintComponent()). Tu dois cependant faire un dispose() sur une copie/vue creee avec Graphics.create().

    - tu ne dois pas appeler repaint() d'une boucle de rendu (la methode que tu as surchargee fait partie du cyle EDT de repainture/propagation des evenements), cela peut provoquer des boucles infinies et autres incoherences et bugs du programme..
    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

  5. #5
    Membre chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Par défaut
    Citation Envoyé par bouye Voir le message
    Arf, ca m'apprendra a lire le code de maniere plus detaille meme s'il ne fait que 4 lignes :

    - tu ne DOIS PAS faire dispose() sur le Graphics passe en parametre la methode paint() (ou paintComponent()). Tu dois cependant faire un dispose() sur une copie/vue creee avec Graphics.create().

    - tu ne dois pas appeler repaint() d'une boucle de rendu (la methode que tu as surchargee fait partie du cyle EDT de repainture/propagation des evenements), cela peut provoquer des boucles infinies et autres incoherences et bugs du programme..
    Bon je résume : je code comme un bouraing . je vais corriger tout ça et voir si ça marche...

    On apprend tout les jours...

  6. #6
    Membre chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Par défaut
    Voilà j'ai corrigé j'ai retiré le repaint() et le g.dispose() et remplacé le ImageObserver 'null' par 'this' et ça marche. Il n'y a pas d'objection?

    - tu ne DOIS PAS faire dispose() sur le Graphics passe en parametre la methode paint() (ou paintComponent()). Tu dois cependant faire un dispose() sur une copie/vue creee avec Graphics.create().
    Alors question : il vaut mieux travailler sur une copie ou sur l'original?

    Je m'excuse. Coder est un loisir et je fais ça en autodidacte donc j'ai souvent du mal avec les subtilités ce qui fait que je ne code pas toujours très proprement

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Pas de probleme.

    Dans un cas aussi simple, cela ne sert a rien de faire un copie.

    Une copie peut etre utile :

    - pour restreindre la zone de clip.

    - pour eviter d'avoir a defaire tout un tas de modifications (clip, RenderingHints, Font, Stroke, Paint, Composite, ...) et de transformation (scale(), rotate(), translate(), setTransform(), ...) pour lesquelles il aurait fallu garder des copies des valeurs d'origines. De plus compte tenu de la precision des nombres, on ne revient pas forcement a l'etat initiale quand on fait une rotation par l'angle opposee par exemple en fin de dessin.

    En general, depuis pas mal de temps, mes squelettes d'operation de dessin ressemblent a ca :


    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
    /** {@inheritDoc}
     */
    @Override protected void paintComponent(Graphics g) {
      Dimension size = getSize();
      Insets insets = getInsets();
      int width = size.width - (insets.left + insets.right);
      int height = size.height - (insets.top + insets.bottom);
      Graphics2D g2d = (Graphics2D)g.create(insets.left, insets.top, width, height);
      try {
        ...
      }
      finally {
        g2d.dispose();
      }
    }
    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

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

Discussions similaires

  1. [WebForms]Image qui ne s'affiche pas
    Par Filippo dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 19/12/2007, 20h51
  2. images qui ne s'affichent pas
    Par mikees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/08/2006, 23h31
  3. background image qui ne s'affiche pas :(
    Par vermo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 26/08/2005, 10h01
  4. [HTML]Image qui ne s'affiche pas sous firefox...
    Par OrangeBud dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2004, 13h42
  5. [debutant][Tomcat]Images qui ne s'affichent pas
    Par omega dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2004, 09h44

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