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

AWT/Swing Java Discussion :

[SWING] Convertir composant en image


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 8
    Par défaut [SWING] Convertir composant en image
    Bonjour à tous !

    Je suis depuis deux jours sur un problème de conversion d'un composant en image et je m'en remets à vous après avoir épuisé le stock Google et forums en tous genres.

    Mon BUT : générer une java.awt.Image représentant un java.awt.Component. Voici la signature de la méthode que je veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Image getImage(Component component);
    J'ai trouvé l'implémentation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static Image getImage(Component component) {
    	BufferedImage image = new BufferedImage(component.getWidth(), component
    		.getHeight(), BufferedImage.TYPE_INT_RGB);
    	Graphics2D g2d = image.createGraphics();
    	component.paint(g2d);
    	g2d.dispose();
    	return image;
        }
    Il fonctionne parfaitement pour des composants simples MAIS dès que j'ai un composant composé de sous-composants, c'est pas génial ! Prenons un exemple : J'ai un JPanel avec un FlowLayout. Je place dans mon JPanel des JLabel. L'image générée va contenir le résultat du paint du JPanel et du paint du premier JLabel. Mais apparemment il n'y a pas eu l'appel au paint des autres JLabel !

    Alors à force de vadrouiller sur le net, j'ai essayé de remplacer "paint" par "paintAll" mais du coup, l'image générée est complètement noire !

    J'ai donc essayé d'autres codes avec des histoires de Transparency.....................

    Bref je suis complètement perdu ! Est-ce que quelqu'un a déjà eu ce problème ? Encore mieux Est-ce que quelqu'un aurait la solution ?

    Je remercie d'avance toute âme charitable ayant déjà lu entièrement mon message et je remercierai encore plus tous ceux qui pourront m'apporter des réponses !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu te fait probablement arnaquer par le doubleBuffering et le comportement lightweight des JComponent. Le mieux à faire, c'est de passer par les appels "print" ou "printAll", qui font le même mais en désactivant tout le système de doublebuffering (par définition, en cas de "print" on a rien d'existant, juste une "feuille" blanche :p)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 8
    Par défaut
    Merci de ta réponse mais malheureusement j'ai essayé de remplacer paint par paintAll, par print et par printAll et ça ne change absolument rien...... Toujours le même problème avec mon JPanel composé de JLabel !

    Je vais essayer de fouiller dans l'histoire du Double buffering !

    Si quelqu'un a une autre solution, n'hésitez pas ! Merci encore !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 8
    Par défaut
    Le problème est résolu après avoir bossé deux jours dessus, il fallait bien une journée de repos pour tasser tout ça !

    Pour ceux que ça intéresse et qui auraient le même problème que moi, je vais expliquer ce que j'ai essayé ce matin et qui fonctionne :

    J'ai tout simplement fait un "setLocation(x, y)" sur chacun de mes "JLabel" dans mon "JPanel". Et avec ça tout fonctionne avec un simple "paint" dans ma méthode "getImage" !!

    C'est génial l'informatique !! Ca tient parfois à très peu de choses !

    Merci à ceux qui se sont plongés sur mon problème et j'espère que ça profitera à d'autres !

  5. #5
    Nouveau candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Salut
    j'ai un problème dans le même style.
    J'ai un peux retravailler la fonction getImage à mes besoin mais c'est vraiement pas grand chose.
    j 'ai donc ca dans la classe du composant dont je voudrais une image:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public BufferedImage getImage()
    {
    int width = getPreferredSize().getWidth();
    int height = getPreferredSize().getHeight();
    BufferedImage img =new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    Graphics2D g =image.createGraphics();
    this.paintAll(g);
    g.dispose();
    return img;
    }

    Ensuite cette image je la met dans un fichier.
    Le soucis c est sur l'image que j'ai au final. J'ai genre fois la même image superposer, plus ma barre de menu(on accede a la fonction d'enregistrement par ce menu)

    si quelqun vois le soucis
    merci de m'aider

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    comme déjà mentionné plus haut, c'est "printAll" qu'il faut utiliser.

    accessoirement, vérifie que ton composant est bien "opaque"

  7. #7
    Nouveau candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    En fait j avais deja essayer avec printAll
    parcontre le coup de setOpaque(true) je savais pas
    je retourne manger de la javadox poru comprendrre le pourquoi c'est inspensable.
    Mais en tout cas
    MERCI

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le setOpaque() force simplement le composant à dessiner aussi son background. Comme ton image est pas transparent, il est normal de ne pas travailler avec un composant transparent.

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

Discussions similaires

  1. Convertir texte en image
    Par arnaud_verlaine dans le forum Flash
    Réponses: 10
    Dernier message: 26/09/2006, 09h15
  2. [Swing] Comment insérer une image png puis la déplacer?
    Par Cervantes dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/05/2006, 19h51
  3. [FLASH 8] Convertir swf -> fichier image
    Par mic79 dans le forum Flash
    Réponses: 7
    Dernier message: 12/05/2006, 11h59
  4. [Graphique] Convertir pdf en image
    Par anykeyh dans le forum Graphisme
    Réponses: 5
    Dernier message: 18/01/2006, 16h51
  5. [SWING]affichage d'une image
    Par chico_du_33 dans le forum AWT/Swing
    Réponses: 51
    Dernier message: 08/07/2005, 09h55

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