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

Java Discussion :

Dessiner mon GUI pour une impression


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut Dessiner mon GUI pour une impression
    Bonjour,

    J'aimerais imprimer le contenu d'un JPanel (ou d'une JFrame). Actuellement j'ai le code suivant :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    import java.io.UnsupportedEncodingException;
    import java.security.Key;
     
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
     
     
    public class Main  {
     
    	/**
             * @param args
             */
    	static JFrame frame;
    	public static void main(String[] args) {
    		frame=new JFrame();
    		JPanel pann=new JPanel();
    		pann.add(new JLabel("yop"));
    		frame.setContentPane(pann);
    		frame.setVisible(true);
    		frame.pack();
    		Rapport.print();
     
    	}
     
    }
     
    class Rapport {
    	static void print() {
    		// Récupère un PrinterJob
    	      PrinterJob job = PrinterJob.getPrinterJob();
    	      // Définit son contenu à imprimer
    	      job.setPrintable(new PrintRapport());
    	      // Affiche une boîte de choix d'imprimante
    	      if (job.printDialog()){
    	         try {
    	            // Effectue l'impression
    	            job.print();
    	         } catch (PrinterException ex) {
    	            ex.printStackTrace();
    	         }
    	      }
    	}
    }
     
    class PrintRapport implements Printable {
     
    	   /** Constructeur par défaut de PrintRectangle */
    	   public PrintRapport() {
    	   }
     
     
    	   public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    	      // Par défaut, retourne NO_SUCH_PAGE => la page n'existe pas
    	      int retValue = Printable.NO_SUCH_PAGE;
    	      switch(pageIndex){
    	         case 0 : {
    	            // Dessin de la première page
    	            // Récupère la dimension de la zone imprimable
    	            double xLeft  = pageFormat.getImageableX();
    	            double yTop   = pageFormat.getImageableY();
    	            double width  = pageFormat.getImageableWidth();
    	            double height = pageFormat.getImageableHeight();
     
     
    	            // La page est valide
    	            retValue = Printable.PAGE_EXISTS;
     
    	            graphics=Main.frame.getGraphics();
    	            graphics.setClip((int)xLeft, (int)yTop, (int)width, (int)height);
    	            break;
    	         }
    	      }
    	      return retValue;
    	   }
    	}
    Mais la page est vide et j'ai l'impression que Main.frame.getGraphics(); ne retourne pas ce qu'il y a dans la frame mais plutot une "image" vide.

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Bonjour,

    la réponse se trouve dans la FAQ Comment obtenir une Image de mon composant graphique ?
    Ton erreur est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphics=Main.frame.getGraphics();
    Ce code affecte le graphic de la JFrame à la variable, écrasant la référence qui est passée en paramètre de la méthode (les références sont passées par valeur). En faisant ça tu "perds" cette référence alors que c'est celle là que tu veux modifier.
    Donc en reprenant le code de la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Main.frame.paintAll(graphics);
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Oui en effet ça marche mais j'ai une petite question subsidiaire.
    J'aimerais peindre le composant sur la page à imprimer mais je voudrais que l'utilisateur n'ai pas le composant affiché (frame.setVisible(false). Là ton code ne marche plus. Comment faire sans afficher le composant ?

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Effectivement la méthode repaintAll() nécessite que le composant soit affiché, je ne sais pas comment tu pourrais faire sans .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Au final j'affiche les fenêtres je fait l'impression et je ferme les fenêtres.
    Par contre j'ai un petit problème, le composant est imprimé tout en haut à gauche et du coup quand on imprime on est vraiment au bord de la feuille.

    Comment faire pour que le composant se peigne avec un leger décalage en bas à droite pour laisser une marge entre ce qui est écrit et le bord de la feuille ?

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

Discussions similaires

  1. faire un GUI pour une application console
    Par Truth dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/02/2008, 15h05
  2. [C++]Quelles solutions pour une impression propre
    Par Pfeffer dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/01/2007, 09h45
  3. Deux passages dans mon "execute" pour une seule soumission
    Par fabricew59 dans le forum Struts 1
    Réponses: 7
    Dernier message: 27/06/2006, 14h24
  4. Macro pour une impression ne fonctionne pas
    Par aujero dans le forum Access
    Réponses: 2
    Dernier message: 01/06/2006, 17h23
  5. Réponses: 2
    Dernier message: 10/05/2006, 09h22

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