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 :

Créer une BufferedImage d'un composant invisible


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut Créer une BufferedImage d'un composant invisible
    Bonjour,

    J'aimerais savoir comment créer une BufferedImage de tout le contenu d'un JScrollPane et du JPanel qui le contient.
    J'ai déjà plus ou moins réussi grâce à la deuxième réponse , le problème c'est que, une fois l'image créée, cela fait disparaître complètement le JPanel de ma JFrame et je ne comprend pas pourquoi.

    Merci de votre aide,
    Shadorc

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BufferedImage bi = ...
    jScrollPane.paintComponent(bi.getGraphics());
    jScrollPane.repaint();
    ?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    En fait mon code est le suivant, pane étant le JPanel contenant mon JScrollPane.

    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
    private File screen;
     
    public Upload(JPanel pane) {
     
    	try {
    		 screen = new File("./screen.jpg");
     
                     BufferedImage bi = paintComponent(pane);
    		 ImageIO.write(bi, "jpg", screen);
     
    	} catch (IOException e) {
    		JOptionPane.showMessageDialog(null, "Erreur lors de la capture d'écran, " + e.getMessage(), "Erreur", JOptionPane.ERROR_MESSAGE);
    	}
    }
     
    public static BufferedImage paintComponent(Component c) {
     
    	c.setSize(c.getPreferredSize());
    	layoutComponent(c);
     
    	BufferedImage img = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_RGB);
     
    	CellRendererPane crp = new CellRendererPane();
    	crp.add(c);
    	crp.paintComponent(img.createGraphics(), c, crp, c.getBounds());    
    	return img;
    }
     
    public static void layoutComponent(Component c) {
    	synchronized (c.getTreeLock()) {
    		c.doLayout();
    		if (c instanceof Container)
    			for (Component child : ((Container) c).getComponents())
    				layoutComponent(child);
    	}
    }
    Ce code marche parfaitement, le problème c'est que une fois que je prend le screenshot, ce JPanel disparaît de ma JFrame, comme si le CellRendererPane le remplaçait. Et c'est ça mon problème. J'ai essayé de le corriger avec repaint(), revalidate(), en créant une copie du JPanel avant de prendre le screenshot, rien n'a été concluant.

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Bah oui, quand tu fais add, ça enlève le composant de là où il était pour le mettre dans le nouvelle emplacement....

    Dans ton code, je ne comprend ni le setSize, ni le add, ni les doLayout, ni le CellRendererPane...

    Tout ce que tu dois faire, c'est dessiner le composant dans une image: pas le déplacer, pas le redimenssionner, etc.

    Taille un peu dans le vif, et reviens en cas de souci.
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Ah oui j'ai compris merci. Mais tout cela permet de redessiner ce que je veux avoir dans le BufferedImage sur un nouveau JPanel (le CellRenderPane) pour qu'il soit à sa taille par défaut, celle où l'on voit tous son contenu.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    Je n'ai toujours pas trouvé comment créer une BufferedImage d'un JScrollPane qui n'est pas visible en entier... Personne ne sait ? :/
    La méthode de Pill_S marche mais cela prend que la zone visible et non pas le JScrollPane en entier.

    Merci

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Et si tu "paintais" le composant contenu dans le jscrollpane plutôt que le scrollpane lui-même?

    Éventuellement aussi, en utilisant "scale" pour faire un zoom...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Bon je comprend la logique, t'as un panel, qui lui même contient différents éléments donc un scrollpane, et tu veux générer une image de l'ensemble sans barres de défilement. D'ou la nécessité de le mettre dans une conteneur plus grand. C'est bien joli, et ça marche visiblement, mais comme on l'a dit, tu a oublié de remettre le composant à sa place initiale une fois l'opération terminée

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    C'est bon, merci à vous deux! Il suffisait juste de re-add le JPanel que j'utilisais à sa fenêtre de départ. Super !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/04/2008, 16h38
  2. Réponses: 4
    Dernier message: 09/10/2007, 09h00
  3. Réponses: 2
    Dernier message: 28/02/2007, 20h57
  4. [Débutant] Créer une BufferedImage
    Par Mo_Poly dans le forum Multimédia
    Réponses: 3
    Dernier message: 28/02/2007, 02h16
  5. [Débutant creation de composant] Créer une LED numérique
    Par C_Marteau dans le forum C++Builder
    Réponses: 8
    Dernier message: 14/06/2005, 21h23

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