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 :

impression d'une fenetre


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut impression d'une fenetre
    bonjour, j'ai quelque probleme pour imprimer une fenetre

    disons que je veuille imprimer "fen2" dans le programme ci-dessous(l'une des nombreuses fenetres de mon programme), comment puis je m y prendre???

    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
     
    class Extended extends JFrame
    {
    JFrame fen2 = new JFrame();
    public Extended(){
    //remplissage et affichage de la fenetre "ext" 
    //remplissage et affichage de fen2 
    ......
    }
     
    public static void main(String [] args){
        Extended ext = new Extended();
        ext.setVisible(true);// Affichage de la vue		  
      }
     
    private void Imprimer(){
    JobAttributes ja = new JobAttributes();
    ja.setDestination(JobAttributes.DestinationType.PRINTER);
     
    PageAttributes pa = new PageAttributes();
    pa.setMedia(PageAttributes.MediaType.A4);
    pa.setOrientationRequested(PageAttributes.OrientationRequestedType. LANDSCAPE);
     
    PrintJob pj = getToolkit().getPrintJob(Extended.this,"Printing_Test", ja, pa);
     
    if (pj != null){
                Graphics pg = pj.getGraphics();
                printAll(pg);
    	pg.dispose();
    	pj.end();
    }
    Printer();
    }
    }
    Avec ce programme, je n arrive qu'à imprimer la fenetre "ext"

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    il suffit de remplacer printAll(pg); (qui est équivalent à this.printAll(pg)), par :
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut
    merci bcp!!!!!

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut
    encore un ptit pb,

    la taille de ma fenetre est trop grande pour etre imprimer en A4, dc j'aimerais au moment de l impression reduire ma fenetre é tout ce qu il y a à l interieur (container)pour pouvoir tout imprimer en A4.

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Dans ce cas, il faut récupérer les tailles respectives de la fenêtre et de la feuille, afin de calculer le ratio, puis appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double ratio = tailleA4 / tailleFenêtre;
    Graphics2D pg = (Graphics2D) pj.getGraphics();
     
    // on applique une transformation qui va filtrer
    // toutes les opérations futures de dessin
    pg.scale(ratio, ratio);
     
    printAll(pg); // ou fen2.printAll(pg); ?
    pg.dispose();
    Si jamais tu as une ClassCastException (ça arrive parfois avec les PrintJob), il faut créer une BufferedImage de la taille A4 et utiliser son Graphics2D pour y dessiner la fenêtre (avec le 'scale'), puis utiliser le Graphics du PrintJob pour y dessiner la BufferedImage.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut
    Bien sûr, il a fallut que je tombe dans l'exception

    Il faut que je précise un point : ça ne fait que 2 mois que je fais du java, donc si vous pouviez développer un peu plus vos explications, voir donner un exemple, ça m'aidera à comprendre

    Merci d'avance

  7. #7
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Il y a un fil là-dessus dans le forum, mais je ne le retrouve pas. Le principe, c'est qu'un Graphics permet de dessiner une image, par exemple une BufferedImage. De plus, on peut dessiner sur une BufferedImage avec un Graphics2D. Ca donne :
    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
    int a4Width, a4Height; // taille du papier
    double ratio = Math.min(
      1.0 * a4Width / fen2.getWidth(),
      1.0 * a4Height / fen2.getHeight());
     
    // on crée l'image
    BufferedImage image = new BufferedImage(a4Width, a4Height, BufferedImage.TYPE_INT_RGB);
     
    // on dessine la fenêtre sur l'image
    Graphics2D g2 = image.createGraphics();
    g2.scale(ratio, ratio); // ceci n'est possible qu'avec un Graphics2D
    fen2.printAll(g2);
     
    // on imprime l'image
    Graphics pg = pj.getGraphics();
    pg.drawImage(image, 0, 0, null);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut
    C affreux!!!!!!!!!!

    Je viens de suivre ton conseil et écrire ta méthode pour imprimer

    vla ce que ca donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BufferedImage bufferedImage=new BufferedImage(800,500,BufferedImage.TYPE_INT_RGB);//crée mon BufferedImage
    Graphics2D g2=bufferedImage.createGraphics();//crée un Graphics2D de bufferedImage
    g2.scale(1, 3/4);//mise à l échelle du doc par rapport au papier
     
    fen2.printAll(g2);// on imprime l'image
    Graphics pg = pj.getGraphics();//crée un Graphics  pg
    pg.drawImage(bufferedImage, 0, 0, null);//dessine sur pg la bufferedImage
    et en reponse j ai droit à ce type d'insulte :

    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
     
    java.lang.NullPointerException
    	at sun.java2d.SunGraphics2D.getClipBounds(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at javax.swing.JComponent.print(Unknown Source)
    	at java.awt.GraphicsCallback$PrintCallback.run(Unknown Source)
    	at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    	at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    	at java.awt.Container.print(Unknown Source)
    	at sun.awt.windows.WComponentPeer.print(Unknown Source)
    	at sun.awt.windows.WCanvasPeer.print(Unknown Source)
    	at sun.awt.windows.WPanelPeer.print(Unknown Source)
    	at java.awt.GraphicsCallback$PeerPrintCallback.run(Unknown Source)
    	at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    	at java.awt.Component.printAll(Unknown Source)
    	at Extended$Controller.actionPerformed(Extended.java:6538)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Je vais commencer à déprimer!!!!!

  9. #9
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Par défaut
    je viens de modifier quelques ptit truc (je sais pas si c une bonne idée!!! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BufferedImage bufferedImage=new BufferedImage(800,500,BufferedImage.TYPE_INT_RGB);//crée mon BufferedImage
    Graphics2D g2=bufferedImage.createGraphics();//crée un Graphics2D de bufferedImage
    g2.scale(1, 3/4);//mise à l échelle du doc par rapport au papier
    Graphics pg = pj.getGraphics();//crée un Graphics  pg
    pg.drawImage(bufferedImage, 0, 0, null);//dessine sur pg la bufferedImage
    fen2.printAll(pg);// on imprime l'image
     
     
    g2.dispose();
    pj.end();
    é maintenant j obtiens sous fen2 tjs trop grande un sorte de carré noir de bonne dimension semble t il!!!

    pouvez vous m aider encore un petit peu?

    Merci d'avance

  10. #10
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Apparemment il y a un problème avec la méthode printAll ?? Je ne vois pas trop ce qui peut changer par rapport à ce qu'on faisait avant. C'est tellement étrange qu'un petit clean/recompile pourra peut-être changer quelque chose. Sinon, il faudrait voir chez sun si c'est pas un bug ...

    Si ça perdure et si tu imprimes la fenêtre telle qu'elle apparait à l'écran, tu peux remplacer printAll par paint, ça marchera probablement mieux.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 68
    Par défaut
    Bonjour,

    Je me doute que tu as trouvé une solution depuis longtemps mais pour ceux que ça intéresse et qui sont confronté à des problèmes d'impression liés a l'orientation "paysage" et/ou à la mise à l'échelle d'une fenêtre par rapport à la taille de la page :

    1/ Implémenter l'interface "Printable" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class FrmChart extends JFrame implements Printable
    et donc surcharger la méthode "print()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       /**
        * Implémentation de l'interface Printable
        */
    public int print(Graphics g, PageFormat pf, int indexPage) throws PrinterException {
    	if(indexPage>0) return Printable.NO_SUCH_PAGE;
    	Graphics2D g2 = (Graphics2D)g;
    	g2.translate(pf.getImageableX(), pf.getImageableY());
    	g2.scale( pf.getImageableWidth()/getContentPane().getWidth(),pf.getImageableHeight()/getContentPane().getHeight());
    	getContentPane().printAll(g2);
    	return Printable.PAGE_EXISTS;
    c'est ici que l'on gère la mise à l'échelle via "translate" et "scale"...

    2/ Il reste à présent à récuperer une instance de PrinterJob et à lancer l'impression :

    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
     
    			else if(actionCmd.equalsIgnoreCase("OnPrint"))
    		   {
    				PrinterJob tache = PrinterJob.getPrinterJob();
    				PageFormat pf = tache.defaultPage();
    				pf.setOrientation(PageFormat.LANDSCAPE);
    				tache.setPrintable(FrmChart.this, pf);
    				if(tache.printDialog())
    				{
    					System.out.println("-------- Impression de la courbe ----------");
    					try 
    					{
    						tache.print();
    					} 
    					catch(Exception ex) 
    					{
    						System.out.println("impossible d’imprimer");
    						ex.printStackTrace();
    					}
    					System.out.println("------ Fin impression ------");
    				}
    		   }
    C'est ici que l'on gère le format "paysage" par défaut !

Discussions similaires

  1. [WD14] impression d'une fenetre
    Par alfaz dans le forum WinDev
    Réponses: 4
    Dernier message: 12/05/2012, 18h16
  2. impression d'une fenetre
    Par akwa_77 dans le forum WinDev
    Réponses: 3
    Dernier message: 07/03/2010, 22h16
  3. Réponses: 1
    Dernier message: 26/10/2007, 12h32
  4. comment empecher une fenetre de lancement d'impression de s'ouvrir?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/09/2007, 11h33
  5. Impression d une 2eme fenetre
    Par vince6262 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 19/06/2007, 13h17

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