Impression

Signaler
Messages postés
20
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
17 décembre 2005
-
Messages postés
44
Date d'inscription
mardi 9 juillet 2002
Statut
Membre
Dernière intervention
1 avril 2007
-
Bonjour, je n'arrive pas a imprimer un JTextArea aprs de multiple tentatives. JE ne comprend surement pas le fonctionnement de Printable, ou je ne sais quoi, bref , si un bonne ame povait m'envoyer une exemple d'impression de JTextArea ou tout autre swing ce sera genial. Merci beaucoup

4 réponses

Messages postés
93
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
30 janvier 2009

Salut!

Voici un petit code qui te permet d'imprimer un Component.

import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

public class PrintUtilities implements Printable {
    /** le composant à imprimer */    
  private Component componentToBePrinted;

  /** imprimer composant
   * @param c le composant
   */  
  public static void printComponent(Component c) {
    new PrintUtilities(c).print();
  }
  
  /** constructeur
   * @param componentToBePrinted compsant à imprimer
   */  
  public PrintUtilities(Component componentToBePrinted) {
    this.componentToBePrinted = componentToBePrinted;
  }
  
  /** print method **/
  public void print() {
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setPrintable(this);
    if (printJob.printDialog())
      try {
        printJob.print();
      } catch(PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }
  
  /** print method
   * @param g graphisme
   * @param pageFormat format
   * @param pageIndex index
   * @return valeur de retour de l'impression
   */

  public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }

  public static void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
  }

  /**
   * @param c composant
   */
  
  public static void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
  }
}



Tu crée cette classe (ici elle s'appelle PrintUtilities) puis tu lance ton impression à partir de la classe où tu imprime (par exemple derrière un bouton Imprimer) comme ça :

PrintUtilities pu = new PrintUtilities();
pu.print(Composant à imprimer);

le composant à imprimer peut être tout ce qui hérite de Component (un JPanel, JDialog,...)
Messages postés
3
Date d'inscription
mardi 13 janvier 2004
Statut
Membre
Dernière intervention
14 janvier 2004

J'ai mis le copde suivant pour l'impression mais bma fenetre depasse de la feuille imprimée.
Est -il possible de définir la taille sur la feuille et sa position
public void actionPerformed(ActionEvent e)
{
Properties props = new Properties();

props.put("awt.print.paperSize", "a4");
props.put("awt.print.destination", "printer");


PrintJob pJob = getToolkit().getPrintJob(this,
"Printing_Test", props);
if (pJob != null)
{
Graphics pg = pJob.getGraphics();
printAll(pg);
pg.dispose();
pJob.end();
}
}
Messages postés
83
Date d'inscription
jeudi 24 juillet 2003
Statut
Membre
Dernière intervention
16 février 2005

Pour définir la taille de ta feuille il faut rajouter quelques lignes dans ta classe print():

Paper papier = new Paper();
        double gauche = 10.0 * 72 / 25.4;
        file: //fait une marge de 10 mm (donc 10/25.4 pouces avec un point = 1/72 pouces)
        
        papier.setImageableArea(gauche, 0.0, papier.getWidth() - 2*gauche, papier.getHeight());
        pf.setPaper(papier);
        file:
        printJob.setPrintable(this,pf);


Dans mon cas j'ai fait une marge de coté (gauche et droite de 10 mm, et une marge verticale (haut et bas ) de 0 mm.
Il ne faut pas oublier que tout est spécifié en points et que nous français parlons avec les unités INTERNATIONALES qui sont les millimètres, et que ces *#*! de ricains fonctionnent avec les pouces !!!!

Au final la méthode print() doit être a peut près comme ça :
/** print method **/
    public void print() {
        annuler = false;
        PrinterJob printJob = PrinterJob.getPrinterJob();
        PageFormat pf = printJob.defaultPage();
        
        Paper papier = new Paper();
        double gauche = 10.0 * 72 / 25.4;
        file: //fait une marge de 10 mm (donc 10/25.4 pouces avec un point =1/72 pouces)
        
        papier.setImageableArea(gauche, 0.0, papier.getWidth() - 2*gauche, papier.getHeight());
        pf.setPaper(papier);
        file:
        printJob.setPrintable(this,pf);
        if (printJob.printDialog())
            try {
                 printJob.print();
            } catch(PrinterException pe) {
                 System.out.println("Error printing: " + pe);
            }
        else annuler = true;
    }


Voilà, à plus et bon courage !!!

:question) 8-) 8-) koukounet 8-) 8-) :question)
Messages postés
44
Date d'inscription
mardi 9 juillet 2002
Statut
Membre
Dernière intervention
1 avril 2007

bonjour,

votre code serait-il fait pour un format Lettre ?

Je l'ai utilisé et quand je veux imprimer le contenu de mon composant JEditorPane, l'impression ne veux pas s'effectuer et le gestionnaire d'impression me dit : "Remplacez le papier par Lettre ou forcez l'impression sur A4"

Que dois-je remplacer dans la classe ci-dessus pour que l'impression fonctionne au format A4 ?

Merci d'avance.
Fabien