begin process at 2012 02 04 18:28:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Swing

 > IMPRESSION D'UN JPANEL (SANS COUPURE DES COMPOSANTS EN BAS DE PAGE)

IMPRESSION D'UN JPANEL (SANS COUPURE DES COMPOSANTS EN BAS DE PAGE)


 Information sur la source

Note :
8,2 / 10 - par 10 personnes
8,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Swing Classé sous :impression, jpanel, 2d, swing, printerjob Niveau :Débutant Date de création :31/05/2005 Date de mise à jour :10/06/2005 11:03:22 Vu / téléchargé :25 032 / 4 813

Auteur : mep

Ecrire un message privé
Site perso
Commentaire sur cette source (39)
Ajouter un commentaire et/ou une note

 Description

Voila, cette semaine j'ai aidé plusieurs personnes a régler des problemes d'impression. C'est pourquoi j'ai réalisé cette petite classe afin de nous simplifier la vie avec les impressions. La classe permet d'imprimer le contenu graphique d'un panel en multi-pages. Plusieurs options sont disponibles.
FitIntoPage => permet de redimentionner automatiquement le contenu du JPanel pour qu'il rentre dans une seul et unique page.
WrapComponent => permet un impression sans couper les composants en bas de page. En effet les methodes d'impression de Java coupe les composants en fin de page. Par exemple un text area faisant la moitié de la page mais commençant en bas de celle ci aura ca premiere moitié en bas de la page et la deuxieme sur la deuxime page. Ma class calcul avant l'impression la repartition optimale des composants afin d'éviter le probleme, ainsi si le composant ne rentre pas il sera automatiquement décalé sur la page suivante. Si un composant est plus grand qu'une page il sera coupé ou reduit selon les options choisi avant l'impression.
J'ai tester cette class avec un JPanel avec un GridBaglayout et pas mal de composant (meme des composants imbriqués) et ca marche pas mal, donc je vous en fait profiter.
En amélioration on peut envisager l'impression en bas de page du numero de page, et surement d'autre chose auquelles je n'est pas pensé :D.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 juin 2005 11:03:22 :
Mise a jour contenant des fonctions pour définir les marges et j'ai rajouter une impression du nom et du numero de page.

 Sources du même auteur

Source avec Zip PETIT JEU D'ECHEC EN RESEAU (SERVEUR MULTI-PARTIE)
Source avec Zip Source avec une capture JTABBEDPANE AVEC CROIX DE FERMETURE ET LOOK A LA SWT (EN SWI...

 Sources de la même categorie

Source avec Zip Source avec une capture BANNIÈRE EN SWING : TEXTE DÉFILANT SUR UN JLABEL par Julien39
Source avec Zip Source avec une capture INDICATEUR D'ACTIVITÉ ANIMÉ par Julien39
Source avec Zip Source avec une capture JGRAPH : COMPOSANTS SWING CUSTOMISÉS par Julien39
Source avec Zip Source avec une capture JTABLE CUSTOMISÉE par Julien39
Source avec Zip Source avec une capture BARRE D'ATTENTE CIRCULAIRE par Julien39

 Sources en rapport avec celle ci

Source avec Zip BLACKBOX SWING ET JAVA2D par GodConan
Source avec Zip Source avec une capture MASTERMIND 2D par Darklink88600
JPANEL TEXTE DÉFILANT : MARQEE EN JAVA par co2_gaz
Source avec Zip Source avec une capture PETITE DÉMO À INCORPORER DANS UNE INTERFACE GRAPHIQUE SWING par tucobouch
Source avec une capture PETITE INTERFACE SWING. 3 JTEXTFIELD 2 JBUTTON par poiuytrez3

Commentaires et avis

Commentaire de bloofi le 31/05/2005 22:13:37

genial ^^
bien pratique, marche aussi avec mes panels et tout mon bousin.
merki bien !

Commentaire de indiana_jules le 01/06/2005 10:34:44

Ma foi, je trouve cette classe tès sympathique ;)
merci d'en faire profiter

Commentaire de olivierInfo le 06/06/2005 07:35:07

Beau travail.

Commentaire de muad-dib le 09/06/2005 18:47:54

Très sympa ta classe. Mais tu ne saurais pas s'il y aurait un moyen d'enelever les marges sur les bords lors de l'impression ? (environ 2 - 3 cm de marge chez moi)

Commentaire de mep le 10/06/2005 11:06:25

Voila j'ai fait une mise a jour pour regler le probleme des marges. Dans la fonction de setage de marge il fo donné la taille en pixel a rajouter sur les coté par rapport au document de base. Aussi on peut aussi imprimer le nom du document et le numero de page.

Commentaire de beny_59 le 19/07/2005 10:39:25

Bonjour, chez moi, le paint() pose un problème de superposition graphisme, étant donné que j'ai une architecture de composants assez complexe !
Je suggère donc de remplacer la ligne :
   panel.paint(g2d);
par la ligne :
   panel.printAll(g2d);
qui est plus adapté à l'impression.
Voilà. Sinon, cette classe est géniale. Merci.

Commentaire de SayenVegeta le 07/08/2005 22:56:55

Salut
ca marche bien comme class
mais moi j ai un souci
sur mon panel j ai des JLabel et des JTable
mon probleme c est que en largeur je suis trop grand par rapport a une feuille A4
j ai modifier les marges (merci aux methodes qui vont bien)
mais ca suffit pas du tout
je pense que la methode print(Graphics g, PageFormat pf, int pageIndex) recadre le tout
mais le probleme c est l argument Graphics, je sais pas koi mettre
la feuille que je veux imprimé, c est une JFrame qui continent un JPanel qui contient des JLabel, des JTables
je doit faire quoi? transformer le panel en element Graphics???
si quelqu un pouvai m eclairer se serai sympa
merci

Commentaire de empiret le 12/09/2005 09:11:00

Bonjour,

Moi aussi j'ai le meme besoin:
Mes jtables sont grands, et lors de l'impression, on ne voit pas la totalite.

Commentaire de kinnex91 le 21/09/2005 14:29:03

Hello,
- SAYENVEGETA, EMPIRET :
    Pour transformer votre JFrame en Graphics :
    Graphics g = nom__obj_JFrame.getGraphics();

- Sinon ta classe est génial, faut juste que je me penche sur le GridBagLayout.
- Seul pb rencontré, la boite de dialogue veux m'irmprimer 9999 pages : une idée ?

++ ALL

Commentaire de e_zidore le 08/01/2006 11:26:58

Merçi beaucoup pour cette classe qui m'a été bien pratique.

Commentaire de developabdel le 16/02/2006 16:54:51

bonjour je suis débutant en java, j'ai besoin d'utiliser cette classe alors je vous demande de me poster juste un exemple d'utilisation si possible .. car comme je vous ai dit je viens de commencer en java ! merçi

Commentaire de empiret le 08/03/2006 15:54:23

Je me permets de repondre a cette demande:
Tu as un jpanel: mypanel, que tu veux imprimer.
Ce que tu dois faire:

MPanelPrinter printP = new MPanelPrinter(mypanel);
printP.print();

Par contre, j'ai toujours le probleme d'un jpanel qui n'est pas imprime en entier. Il n'est pas reduit pour etre imprime sur toute la largeur d'une feuille A4.

Commentaire de platinum07 le 01/08/2006 17:21:24

bonjour,
j'aimerais utiliser cette source qui me simplifierait bien la vie, mais voilà, elle ne fonctionne pas chez moi. J'utilise un JPanel dans lequel il y a plusieurs jpanels disposés en grille.
A l'intérieur de chaque, il y a une ImageIcon et un JLabel.
Lorsque je lance l'impression, rien n'apparait sur ma feuille sauf le numéro de ma page et le titre, preuve que le jpanel en entrée n'est pas vide...
quelqu'un aurait-il une idée, je désespère !
d'avance merci.

Commentaire de rem02 le 07/01/2007 01:42:50

Bonjour,
Un grand merci, trés bonne classe à garder sous la main...
Je l'ai modifier afin d'imprimer un JEditorPane... ( simple sufffit de remplacer jPanel par JEditorPane ^^ ).

Sinon il y a juste un petit truc, il n'y a pas toute les ouvertures et fermetures des if et else (je trouve que ça nuis à la lisibilité du code) surtout quand tu est débutant.

Commentaire de atha2 le 16/08/2007 22:10:18

salut,
génial ton truque!!!
merci tu m'enlève une sacré épine du pied

Commentaire de Louch le 12/09/2007 11:22:19

Bonjour,

Excellente classe, très instinctive qui plus est!
A utiliser sans modération.

Commentaire de pokitos le 28/03/2008 16:42:11 8/10

Salut,
Tout d'abord très bon ce code, vraiment génial, merci beaucoup.
J'espère que quelqu'un lira ce message.

Pour ma part j'ai juste modifier en jTextpane le panel , ça marche pareil.

Donc pour ceux qui ont ce problème avec les tables trop grande, je voudrai savoir ce qu'il faut modifier pour réduire la taille de l'image qui sera imprimer et de ce fait avoir mon tableau en entier, sachant que j'imprime en mode paysage grâce au setorientation.
Merci.

Commentaire de tmNoooR le 06/08/2008 19:58:35

merci ta sauvé ma vie

Commentaire de nicomitmal le 17/08/2008 00:35:41

Pas moyen d'imprimer mes infos.
J'ai laissé le JPanel dans le paramètre et le mien est constitué de deux composants : un Jpanel avec des JLabel et un second avec un JTable.
Je n'ai pas d'imprimante sous la main, alors je lance mes impression via Microsoft XPS Document Writer.
Mon document s'imprime dans un fichier qui se créé bien mais il est vierge. Une page blanche pour résultat !
De plus quand je choisi l'option "Imprimer dans un fichier" dans tout les cas il y a un probleme qui s'affiche !
Quelqu'un sait il pourquoi ?? Quelqu'un peut il m'aider ??? merci

Commentaire de nicomitmal le 17/08/2008 01:55:14

Voila de quoi m'intriquer !!
Mes JPanels séparés sont imprimés mais pas quant à l'impression ils sont ensemble !
De plus ma JTable n'imprime qu'une partie, la partie visible, sur la page. Si le nombre de lignes dépasse dans l'affichage et qu'une Jscroll apparait et bien cette barre de défilement apparait aussi à l'impression !! Comment faire pour qu'au lieu de cela ma table apparaisse entière, quitte à prendre deux page s'il faut !
Merci pour votre attention et pour vos éventuels conseils

Commentaire de nicomitmal le 18/08/2008 17:45:33

Voila qui résout mon probleme !
Je viens de voir qu'il faut obligatoirement que mon panel soit introduit dans une JFrame pour être imprimé...Je me demande bien pourquoi mais bon voila !
Le fait est qu'avec cet option -fenetre.setVisible(false)- mon jpanel s'imprime bien !
++ et merci

Commentaire de beberto56 le 03/09/2008 15:11:54

bonjour, tous d'abord merci pour la classe elle marche super bien. J'ai juste un petit problème: je me sert de la méthode FitIntoPage qui recadre parfaitement mon panel mais le problème c'est que en bas de page (car il me reste un peu d'espace) je retrouve le haut de mon panel qui se réimprime à la suite. J'ai donc tous mon panel et une petite partie du meme panel qui s'imprime j'ai donc mon titre en haut et en bas^^.

Est ce que quelqu'un aurais une solution pour éviter cela.

Merci d'avance

Beberto56.

Commentaire de mep le 03/09/2008 16:11:44

hello,

3 ans après, pas facile de me remémorer comment j'ai fait ma classe :)

bon, toujours est il que ça fait pas mal de temps que je m'en sert et je n'ai jamais vu ce pb. Tu peux essayer de finter comme je le fait pour le warpComponent, a savoir dessiner un carré blanc pour masquer la partie qu'on ne veux pas afficher. Regarde ce bout de code :
#  if(wrapComponent)
# {
# double hauteurBlanc = ((Double)taillePages.get(pageIndex)).doubleValue();
# g2d.setColor(Color.WHITE);
# g2d.fillRect(0, (int)hauteurBlanc, (int)largeurPage, (int)hauteurBlanc + (int)hauteurPage);
# }

en gros tu fill un rectangle blanc qui commence sous la partie qui est affichée, donc sous la taille de ton panel + les marges. Normalement cette hauteur est calculé par la méthode calculatePages qui remplie l'arraylist avec les valeurs de la taille réelle de chaque page. Essai de bricoler ça sous l'appel du dessinage du Panel (panel.paint(g2d)).

J'ai pas testé parce que j'ai aps trop le temps, mais dans la théorie ca devrait marcher.

a+

Commentaire de beberto56 le 04/09/2008 09:01:25

Merci MEP c'est bon ta technique fonctionne et encore mici pour ta classe qui me sert énormement.

++ Beberto56.

Commentaire de beberto56 le 05/09/2008 15:34:38

Re mep and all gens,

est ce que tu pourrais m'expliquer la fonction de chacune des méthodes de ta fonction stp et si il y un ordre pour les utiliser stp??
En fait j'ai toujours le même problème c'est à dire quesur un des documents que j'imprime je retrouve mon titre au début de l'impression et je le retrouve à la fin également et la technique du regtangle blanc ne fonctionne pas...
La je n'ai pas trop de solution^^.

Merki d'avance

Beberto56.

Commentaire de chahrah le 08/04/2009 12:54:32

dsl mais je c pas comment utiliser cette classe
pour imprimer  mon propre pannel deja realiser
dsl si vous me donner les etapes pour l'excuter
y a un erreur qs j'excute la classe telle qu'elle est !!

printer started with null constructor

Commentaire de Knice le 04/05/2009 02:27:34

ENORMISSIME !
Merci beaucoup :)

Commentaire de lahoudieeric le 25/05/2009 16:10:46

java.awt.print.PrinterException: Printer is not accepting job.
        at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1295)
        at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1246)


D'autre ont eu cette erreur et si oui comment y remedier ? :o

Commentaire de zbidii le 08/07/2009 13:46:46

slt,
Moi j'ai un autre problème. Quand j'appui sur mon bouton imprimer une fenetre s'ouvre. Mais quand j'appui sur ok rien ne se passe !!!!

Commentaire de chricomis le 23/07/2009 12:27:56

slt j'ai une ptit probleme le code ne marche toujour pas j'aimerai savoir comment utuliser ce code.merci

Commentaire de LAmpli le 24/07/2009 15:28:05

Je galère un peu parce qu'à l'usage de cette classe mon impression sur une seule page de mon JPanel (créé via netbeans)
l'appel se fait comme suit:
MPanelPrinter p = new MPanelPrinter(this);
p.print();

en gros rien de plus normal... mais au résulat on voit plusieurs fenêtres accumulées dont une 2e fois ma fenêtre mais décalée de quelques pixels vers les bas à droite, rendant tout illisible, ainsi que l'ancienne fenêtre OpenDialog et d'autres choses non identifiable mais dans la même veine.

j'ai oublié de préciser que mon panel en contient un fond et plein d'autres jpanel, contenant des jlabel en pagaille (qui donc se chevauchent au final), tout autant de TextFields, des boutons, des ScrollPanel, etc.

quelqu'un sait-il remédier à mon pb ?

Commentaire de LAmpli le 24/07/2009 15:34:43

Encore plus drôle quand je ne fais pas l'ouverture d'un ancien fichier et que j'exécute mon prog normalement, je n'ai plus de pb d'accumulation... sauf que ça n'imprime pas l'arrière plan de la fenêtre !!!

Commentaire de uhrand le 08/08/2009 01:02:16

Je voudrais juste présenter ici une alternative simple (autre philosophie, on imprime en segments):

/*
* ContainerPrintable.java
* We can pass the container to be printed in the constructor.
* The printing is done in segments of height 10.
* We can adapt the segment height using method setSegmentHeight(..)
*/

import java.awt.*;
import java.awt.print.*;
import java.awt.geom.*;

public class ContainerPrintable implements Printable {

    private Container container;//The container to print
    private int segmentHeight = 10;//The container's segment height
    private int totalWidth;//To save total width.
    private int last = -1;//The most recent page index asked to print
    private int segment = 0;//The next segment to print
    private final Rectangle clip = new Rectangle(0, 0, 0, 0);//To store an area to be printed
    private final Rectangle tempRect = new Rectangle(0, 0, 0, 0);

    public ContainerPrintable(final Container container) {
        this.container = container;
        container.setBackground(Color.WHITE);
        totalWidth = container.getWidth();
    }

    public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
            throws PrinterException {
        final int imgWidth = (int) pageFormat.getImageableWidth();
        final int imgHeight = (int) pageFormat.getImageableHeight();
        if (imgWidth <= 0) {
            throw new PrinterException("Width of printable area is too small.");
        }
        // the amount of vertical space available for printing the container
        int availableSpace = imgHeight;
        if (availableSpace <= 0) {
            throw new PrinterException("Height of printable area is too small.");
        }
        // we need a scale factor to fit the container's entire width on the page
        double scaleFactor = 1.0D;
        if (totalWidth > imgWidth) {
            scaleFactor = (double) imgWidth / (double) totalWidth;
        }
        while (last < pageIndex) {
            if (segment >= getSegmentCount()) {// if we are finished with all segments
                return NO_SUCH_PAGE;
            }
            int scaledHeight = (int) (availableSpace / scaleFactor);
            // calculate the area of the container to be printed for this page
            nextClip(scaledHeight);
            last++;
        }
        // translate into the coordinate system of the pageFormat
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        // constrain the container output to the available space
        tempRect.x = 0;
        tempRect.y = 0;
        tempRect.width = imgWidth;
        tempRect.height = availableSpace;
        g2d.clip(tempRect);
        // if we have a scale factor, scale the graphics object to fit the entire width
        if (scaleFactor != 1.0D) {
            g2d.scale(scaleFactor, scaleFactor);
        // otherwise, ensure that the current portion of the container is centered horizontally
        } else {
            int diff = (imgWidth - clip.width) / 2;
            g2d.translate(diff, 0);
        }
        // store the old transform and clip for later restoration
        AffineTransform oldTrans = g2d.getTransform();
        Shape oldClip = g2d.getClip();
        // print the current section of the container
        g2d.translate(-clip.x, -clip.y);
        g2d.clip(clip);
        container.print(g2d);
        // restore the original transform and clip
        g2d.setTransform(oldTrans);
        g2d.setClip(oldClip);
        return PAGE_EXISTS;
    }

    private int getSegmentCount() {
        return container.getHeight() / segmentHeight;
    }

    public void setSegmentHeight(final int segmentHeight) {
        this.segmentHeight = segmentHeight;
    }

    public int getSegmentHeight() {
        return segmentHeight;
    }

    private void nextClip(final int pageHeight) {
        clip.x = 0;
        clip.y += clip.height;// adjust clip to the top of the next set of segments
        clip.height = 0;// adjust clip height to be zero
        // fit as many segments as possible, and at least one
        int segmentCount = getSegmentCount();
        do {
            clip.height += segmentHeight;
            if (++segment >= segmentCount) {
                break;
            }
        } while (clip.height + segmentHeight <= pageHeight);
        clip.width = totalWidth;
    }
}

Commentaire de legnomeminipouss le 18/02/2010 16:52:41

Merci beaucoup.

Ca m'éviter pas mal d'heure de boulot en plus.

Encore merci

Commentaire de Rakh le 03/05/2010 10:24:02

J'ai pris, j'ai essayé et ça me sauve la vie ! Merci mille fois !

Commentaire de era le 18/04/2011 11:11:49

MERCI.

Encore aujourd'hui je me sers de ta classe , je n arrivai pas a faire rentrer mon graphique dans une seule page
génial merci encore
tu m as éviter des heures de boulot inutile et mon patron va être content.

MERCI, MERCI, MERCI.....

Commentaire de doudia le 12/07/2011 14:32:02

merci
mais comment utiliser cette classe car pour instancier la methode print ();

Commentaire de doudia le 12/07/2011 14:43:21

public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
          

Commentaire de doudia le 12/07/2011 14:47:09

bonjour pour la class MPanelPrinter sa imprime mais la moiter de mon panel car la largeur du panel est fixe et j utilise un JScrollepan pour defiler
si kelkun peut m'aider

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Impression [ par manu33 ] Salut,Je voudrais transformer mon JPanel en une image pour pouvoir le redimensionner avant impression. La seule solution que j'ai trouvé est la copie Composants swing et fond transparent !!! [ par wt ] Salut tlm,Comment affecte-t-on une couleur transparente à un composants swing, un JPanel par exemple ?Je dispose d'1 couleur en gradient : son intensi impression avec swing [ par wilber ] Salut!COmment imprimer un fichier texte avec swing???Jsouhaiterais lance l'impression apres avoir fixe les differents parametres (avec la methode prin AU SECOURS: pb d'affichage swing [ par tlehoucq ] Bonjour, voila mon pb: comment faire pour afficher des composants swing au premier plan, je m'explique: je veux afficher un JLabel au des Afficher une image ... galère ... [ par Asrull ] Alors voilà j'ai un gros problème et je tourne en rond depuis deux plombes la dessus. Le but de maclasse c'est juste de créer un composant swing affic [Swing] impression [ par reebook1 ] Bonjour &#224; tous.J'utilise un printDialog pour l'envoi d'impression. Cependant, je voudrais savoir lors de la validation de l'impression quel impri [Swing]JdesktopPane dans un JPanel [ par terminagroo ] Bonjour,Voil&#224; je cherche &#224; ajouter un JDesktopPane dans un JPanel. En fait ce que je veux c'est avoir un panel dans lequel je puisse avoir p impression contenu d'un JPanel [ par claroune ] Bonjour,Je souhaiterais pouvoir imprimer le contenu d'un JPanel mais je ne vois pas du tout comment programmer ca.Pouvez vous m'aider?Merci d'avance Tit prob de base avec SWING dans eclipse et JPANEL [ par Nargzul ] Bonjour,Je me mets gentillement &#224; java, et avec eclipse, je suis en train de cr&#233;er une interface utilisateur.Donc comme on m'a dit, je cr&#2 Impression avec MPanelPrinter.java (de mep) [ par kinnex91 ] Bonjour, peut être pouvez-vous m'aidez : lorsque j'imprime mon JPanel, la fonction de la classe écrite par mep calcul le nombre de pages. Dans mon exe


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,685 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales