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 :

PrinterJob et Graphics2D


Sujet :

2D Java

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut PrinterJob et Graphics2D
    Bonjour,

    Suite à un autre POST sans réponses et a quelques infos supplémentaires, je reformule ma demande !

    J'ai un objet Graphics2D que je sais transformer en image PNG ...

    Je souhaite imprimer cette image (donc a partir du Graphics ou du PNG ca m'est égal) !

    Sachant que la longueur de mon objet peux faire plusieures pages, j'aimerais que cela soit pris en compte par l'imprimante.

    J'aimerais aussi que l'objet se dimensionne automatiquement suivant le format de page choisit (ex : A4 ou A3)

    Merci a vous !

    PS : J'ai un peu de doc mais malgré ca je n'arrive pas a adapter !
    => http://download.java.net/jdk6/docs/t...JPSTOC.fm.html

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Dans ton Printable tu peux utiliser la methode getSubimage() de la classe BufferedImage pour recuperer la vue appropriee pour une page donnee : les dimensions et l'orientation de la page te sont donnees par l'objet PageFormat. Lors du tout premier run, tu "pre-decoupes" ta page et calcule les rectagles/boites englobates de chacune des pages que tu stocke dans une List. Ensuite tu recuperes le Rectangle correspondant a la page en cours et tu recupere la sous-image appropriee que tu dessines dans le graphics et tu retourne PAGE_EXISTS. Quand tu depasses la derniere page, tu retournes NO_SUCH_PAGE.

    Quand au printing services, je ne les utilises jamais et franchement je n'en voit pas l'interet puisqu'avec un Printable on peut imprimer soi-meme n'importe quoi sur n'importe quelle imprimante. Ils ne sont guere utiles que quand tu ne sais pas comment afficher/representer une donnee (ex : un fichier Word ou PDF) et que tu preferres laisser le services ou l'eventuelle imprimante capable de supporter cette donnee se charger de l'impression. Clairement pour une simple image, tu es capable de te debrouiller avec un Printable et Java2D.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    D'accord ...

    Actuellement j'ai fait une nouvelle classe rien que pour ca afin de faire ma popotte tranquille ... Ma classe est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class xxx extends JXTitledPanel implements Printable
    Le problème c'est que j'ai du mal a comprendre certaines choses ... Par exemple a quel moment je dois "découper" mon image, et comment le faire !

    Ce, du fait que je souhaite dans un premier temps afficher le numéro de page en bas (j'ai trouvé exemple dur DVP) mais aussi le nom de la JTable et la date en haut. Ensuite j'aimerais que l'image soit "scalable" en fonction du format de la page ...

    Faut dire que j'ai un exemple pas mal mais je n'arrive pas a l'adapter a mon cas ...

    Il faut aussi que sur chaque page j'aie :
    - Mon entête de tableau (c_list.getTable ().getTableHeader ())
    - La page de données (c_list.getComponent ())

    Voila si jamais tu peux me guider ...

    Merci en tous cas !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Note : pas la peine de marquer le topic comme resolu si tu continue a poster des questions lies a la premiere dedans.

    Deja on va partir de ce squelette-ci que l'on etendra au fur et a mesure. Et pour faciliter les chose on supposera dans un premier temps que l'orientation est PORTRAIT ou LANDSCAPE.

    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
    public class sp_impr extends JXTitledPanel implements Printable {
      /** Indicates the layout has been done the first time.
      */
      private layoutDone = false;
     
      private int pageNumber = 0;
     
      /** @inheritDoc
      */
      public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)  {
        int x = pageFormat.getImageableX();
        int y = pageFormat.getImageableY();
        int width = pageFormat.getImageableWidth();
        int height = pageFormat.getImageableHeight();
        int orientation = pageFormat.getOrientation();
        if (!layoutDone) {
          /** @todo  pre-layout pages here. */
          /** @todo  pre-calculate page number here. */
          layoutDone = true;
        }
        // We've finished printing.
        if (pageIndex >= pageNumber) {   
          return NO_SUCH_PAGE;
        }
        graphics.translate(x, y);
        /** @todo Print correct page here. */
        graphics.translate(-x, -y);
        return PAGE_EXISTS;
      }
    }
    Tu dis toi-meme que tu vas devoir imprimer ton image sur plusieurs pages, ce qui implique de l'afficher sur plusieurs pages. Cela implique d'avoir soit :
    - une List<Rectangle> avec chaque rectangle la boite englobante de la zone a imprimer sur l'image.
    - une List<Image> avec chaque image une sous-image (obtenue avec getSubimage() pour eviter de dupliquer de la memoire pour rien) de l'image source.
    Au contraire si tu veux la mettre a l'echelle la methode drawImage(Image image, int x, int y, int width, int height, ImageObserver observer) du graphics fera tout a fait l'affaire.

    Ensuite il serait bon de montrer un prototype dessin a la main ou via un montage realise sur ordi du type de page que tu veux imprimer. Egalement il serai bon de savoir (pour moi en tout cas) quels types d'objets sont retournes par les methodes que tu mentionnes... et comment tu souhaites que tout cela soit represente. Veux-tu que les tailles de tes entetes et pieds de page soient de taille fixe ou puisse s'adapter a ce que tu imprimes/dessines dedans ???
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Arf désolé, en tous car merci a toi de ta réponse !

    Je vais détailler plus ...

    Je veux imprimer un simple tableau qui se trouve donc dans une JXTable ...

    Bien sur le tableau pourra faire un nombre important de lignes, ca dépendra des choix de l'utilisateur !

    L'entête du tableau devra être affichée à chaque début de page pour rapeller le libellé des colones.

    Sinon j'avais fermé le sujet car les règles ont changé... Il faudrait que je reconstruise dynamiquement la table en la redessinant sur un Graphic2D ... Mais c'était acr j'arrivais pas à l'imprimer comme je l'avais demandé ! Ca serait super si je pouvais directement le faire ...

    Sinon j'ai un peu de mal a comprendre le fonctionnement des printerJobs et tout ce qui va avec ...

    Merci pour le code !

    Sinon pour les infos en tête et pied de page elles peuvent être de taille fixe, mais doivent se positionner de la bonne facon suivant le format de la page ...

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par JamesP
    Sinon j'ai un peu de mal a comprendre le fonctionnement des printerJobs et tout ce qui va avec ...
    Quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setPrintable(printable);
    if (printJob.printDialog()) {
      printJob.print();
    }
    Basiquement, en interne, le job va faire quelques chose similaire a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (printable.print(graphics, pageFormat, pageIndex) != Printable.NO_SUCH_PAGE) {
      // Send page graphics to the printer.
      pageIndex ++;
    }
    Note : pour etre precis si tu fais des impressions ou met des break points dans le printable tu verras que le printerJob passe en fait 2 fois sur chaque page.

    Tu peux envisager ta page comme le montre l'image ci-jointe :
    - a priori ta table fera toute la largeur de la zone imprimable.
    - a priori ton entete a une hauteur fixe (0 s'il n'y a pas d'entete).
    - a priori ton pied de page a une hauteur fixe (0 s'il n'y a pas de pied de page).
    -a priori j'imagine que tu veux avoir tes tetes de colonnes sur chaque page et que ces tetes de colonnes ont une hauteur fixe.
    - a priori chaque ligne de ta table a une hauteur fixe.

    Ton probleme consiste tout simplement a trouver :
    - le nombre (entier) de colonnes qui peuvent rentrer dans imageableHeight-(headerHeight + colomnHeaderHeight + footerHeight) pour une page.
    - en deduire le nombre de page par rapport au nombre de lignes a imprimer.
    - en deduire l'indice de la premiere ligne qui apparaitra en haut de chaque page.

    Ensuite cela depend si tu peux dessiner manuellement toi-meme chaque ligne ou si tu ne peux que manipuler la methode paint() globale de la table.
    - dans le premier cas, normalement tu devrais savoir alors comment dessiner les tetes de colonnes au bon endroit et les lignes appropriees pour chaque page.
    - dans le second cas on peut alors utiliser la methode paint() ou print() de la table et jouer avec les methodes translate() et setClip() du graphics avec les valeurs appropriees de maniere a ne dessiner que des "vues" de la table aux bon endroits :
    - une vue sur les tete de colonnes sur chaque page.
    - une vue sur les lignes rowIndexForPageIndex -> rowIndexForPageIndex + numberOfRowsPerPage pour la page pageIndex donnee.

    Quand a l'alignement horizontal (gauche, droite, centre) et vertical (haut, bas, centre) des entete et pieds de page, tu peux connaitre les tailles, hauteur et ligne de base d'un texte via les methode :
    - Font.getStringBounds(String str, FontRenderContext frc);
    - Font.getLineMetrics(String str, FontRenderContext frc);
    - LineMetrics.getAscent();
    Qui sans etre 100% precises seront probablement suffisantes pour effectuer les calculs appropries pour un premier affichage.
    Le FontRenderContext t'etant fournis par la methode graphics.getFontRenderContext().

    Note : dans drawString() les coordonnes x et y a fournir sont celles de la baseline, pas celles du coin superieur gauche.

    N'oublie pas egalement que tu peux faire varier la police de maniere a mettre une police plus petite que celle utilisee pour l'affichage a l'ecran.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Merci beaucoup a toi ...

    Le dessin, c'est EXACTEMENT ca !!!

    Mais j'ai du mal avec ces calculs ... Regarde j'avais trouvé ca sur DVP :

    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
    public int print( Graphics g, PageFormat pageFormat, int pageIndex ) throws PrinterException {
     
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor ( Color.black );
        int fontHeight = g2.getFontMetrics ().getHeight ();
        int fontDescent = g2.getFontMetrics ().getDescent ();
     
        // laisser de l'espace pour le numero de page 
        double pageHeight = pageFormat.getImageableHeight () - fontHeight;
        double pageWidth = pageFormat.getImageableWidth ();
        double tableWidth = (double) c_list.getTable ().getColumnModel ().getTotalColumnWidth ();
        double scale = 1;
        if ( tableWidth >= pageWidth ) {
          scale = pageWidth / tableWidth;
        }
        double headerHeightOnPage = c_list.getTable ().getTableHeader ().getHeight () * scale;
        double tableWidthOnPage = tableWidth * scale;
        double oneRowHeight = (c_list.getTable ().getRowHeight () + c_list.getTable ().getRowMargin ()) * scale;
        int numRowsOnAPage = (int) ((pageHeight - headerHeightOnPage) / oneRowHeight);
        double pageHeightForTable = oneRowHeight * numRowsOnAPage;
        int totalNumPages = (int) Math.ceil ( ((double) c_list.getTable ().getRowCount ()) / numRowsOnAPage );
        if ( pageIndex >= totalNumPages )
          return NO_SUCH_PAGE;
     
        g2.translate ( pageFormat.getImageableX () , pageFormat.getImageableY () );
        // en bas au centre 
        g2.drawString ( "Page: " + (pageIndex + 1) , (int) pageWidth / 2 - 35 , (int) (pageHeight + fontHeight - fontDescent) );
        g2.translate ( 0f , headerHeightOnPage );
        g2.translate ( 0f , -pageIndex * pageHeightForTable );
        // si cette partie de la page est plus petite 
        // que la taille disponible, alors découper les contours appropriés 
        if ( pageIndex + 1 == totalNumPages ) {
          int lastRowPrinted = numRowsOnAPage * pageIndex;
          int numRowsLeft = c_list.getTable ().getRowCount () - lastRowPrinted;
          g2
              .setClip ( 0 , (int) (pageHeightForTable * pageIndex) , (int) Math.ceil ( tableWidthOnPage ) , (int) Math
                  .ceil ( oneRowHeight * numRowsLeft ) );
        }
        // sinon découper la zone disponible toute entière 
        else {
          g2.setClip ( 0 , (int) (pageHeightForTable * pageIndex) , (int) Math.ceil ( tableWidthOnPage ) , (int) Math.ceil ( pageHeightForTable ) );
        }
        g2.scale ( scale , scale );
     
        /* Créer tableau */
     
        g2.drawLine ( 5 , 5 , (int)tableWidthOnPage , 5 );
     
        /* Fin créer tableau */
     
        // dessiner les entêtes en haut 
        g2.scale ( 1 / scale , 1 / scale );
        g2.translate ( 0f , pageIndex * pageHeightForTable );
        g2.translate ( 0f , -headerHeightOnPage );
        g2.setClip ( 0 , 0 , (int) Math.ceil ( tableWidthOnPage ) , (int) Math.ceil ( headerHeightOnPage ) );
        g2.scale ( scale , scale );
        c_list.getTable ().getTableHeader ().paint ( g2 );
        return Printable.PAGE_EXISTS;
      }
    Mais j'arrivais pas a l'adapter ... En théorie j'ai compris tout ce que tu m'a dis ... Reste la pratique !

    Genre dans l'exemple, pourquoi le mec fais deux "translate" à la suite ? Pourquoi pas cumuler les deux en un ? Et c'est sur cet exemple que j'avais essayé de faire ce que je t'ai dis ... Mais je vais encore devoir plancher dessus pas mal de temps ...

    Peux tu me dire ce que tu en pense ?

    Merci ... Moi je vais sur mes printersjobs !!! ^^

    PS : Encore merci !

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par JamesP
    Genre dans l'exemple, pourquoi le mec fais deux "translate" à la suite ?
    Probablement pour rendre le code plus lisible pour un novice en detachant bien les differentes etapes.

    Citation Envoyé par JamesP
    Pourquoi pas cumuler les deux en un ?
    Tu peux sans probleme.

    PS : J'oubliais, plutot que de gacher du papier a la tonne pour faire des tests d'impression tu peux tres bien utiliser le Printable que tu es en train de coder pour generer des images que tu stockeras sur le disque via ImageIO.

    ex : [Swing] Imprimer des JeditorPane sur plusieurs pages ?
    Note que c'est plus facile pour une JTable d'avoir des vues qui ne coupent pas des lignes en deux puisque tu connais la hauteur de chaque ligne.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Merci a toi je continue mais je m'en sort vraiment pas ... J'ai planché la jounée dessus et ca avance peu ... beaucoup de tests pas très concluants !

    J'arrive pas a afficher le nom de la Jtable en haut-gauche et la date en haut droite ...

    En plus si je passe direct la JTable au printerjob les lignes d'entete en HTML ne s'impriment pas !!! Galere ...

    J'ai 2 solutions :
    - Passer la Jable en PNG puis découper l'image pour imprimer => Galere pour pas couper les lignes
    - Lire la JTable et la redessiner entièrement en Graphics2D ... Ce que j'aimerai vraiment faire mais super chaud aussi ...

    Enfin pas facile quoi !

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Generer une image me semble une bonne idee pour partir et ne devrait pas etre top complique. Normalement il doit etre possible de faire sans cependant; quoique pour le probleme du HTML je ne sais pas trop, le probleme vient peut-etre de la JXTable par contre il est clair que tu ne peux pas imprimer directement du HTML toi-meme via drawString() il faut le rendre dans un composant (JLabel, JTextPane, JEditorPane) transparent ou a fond blanc et le dessiner sur le graphics).

    Sinon l'idee est de faire quelque chose de similaire a ca (code non teste avec sans doute pas mal d'erreurs) :

    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
    private BufferedImage image;
     
    private int columnHeaderViewPortWidth;
    private int columnHeaderViewPortHeight;
     
    private int rowViewPortWidth;
    private int rowViewPortHeight;
     
    private int columnHeaderHeight;
    private int headerHeight;
    private int footerHeight;
     
    private int pageNumber;
    private int numberOfRowsPerPage;
     
    ...
     
        if (!layoutDone) {     
          columnHeaderHeight = ...;
          headerHeight = ...;
          footerHeight = ...;
          int rowHeight = ...;
          int rowNumber = ...;
          // Dimension of the image.
          int imageWidth = width;
          int imageHeight = rowHeight + rowNumber*rowHeight;
          // Set the table to the proper dimension.
          Dimension oldSize = getSize();
          setSize(imageWidth, imageHeight);
          // Create image.
          image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RBG); 
          Graphics2D g2d = image.createGraphics();
          // Paint table into imabge.
          // maybe paintAll(g2d); ?
          paint(g2d);
          g2d.dispose();
          setSize(oldSize);
          // calculate view port dimensions.
          columnHeaderViewPortWidth = imageWidth;
          columnHeaderViewPortHeight = columnHeaderHeight;
          rowViewPortWidth = imageWidth;
          int tableImageableHeightForEachPage = height - (headerHeight + columnHeaderHeight + footerHeight);
          pageNumber = Math.max(1, (rowNumber*rowHeight) / tableImageableHeightForEachPage);
          numberOfRowsPerPage = tableImageableHeightForEachPage / rowHeight;
          layoutDone = true;
        }
        // We've finished printing.
        if (pageIndex >= pageNumber) {   
          return NO_SUCH_PAGE;
        }
        // Move to imageable area.
        graphics.translate(x, y);
        /** @todo Print header here. */
        graphics.translate(headerHeight);
        BufferedImage columnHeaderImage = image.getSubimage(0, 0, columnHeaderViewPortWidth, columnHeaderViewPortHeight);
        graphics.drawImage(columnHeaderImage, 0, 0, null);
        graphics.translate(columnHeaderViewPortHeight);
        /** @todo Test that when the last image chuck is smaller than rowViewPortHeight */
        //int chunkHeight = Math.min(rowViewPortHeight, )
        BufferedImage rowImage = image.getSubimage(0, columnHeaderViewPortHeight+pageIndex*numberOfRowsPerPage, rowViewPortWidth, rowViewPortHeight);
        /** @todo Test that when the last image chuck is smaller than rowViewPortHeight */
        // In such case use something similar to that.
        //int chunkHeight = Math.min(rowViewPortHeight, image.getHeight-(columnHeaderHeight + pageIndex*rowViewPortHeight));
        //BufferedImage rowImage = image.getSubimage(0, columnHeaderViewPortHeight+pageIndex*numberOfRowsPerPage, rowViewPortWidth, chunkHeight);
        graphics.drawImage(rowImage, 0, 0, null);
        graphics.translate(rowViewPortHeight);
        /** @todo Print footer here. */
        /** @todo go back to the top of the page. */
        // Reset to origin.
        graphics.translate(-x, -y);
        return PAGE_EXISTS;
     }
    Couper au niveau d'une ligne est simple quand on connait la hauteur d'une ligne. Il peut y avoir cependant besoin de faire quelques rectifications en bas ou en haut de page (dessiner une bordure de cellule manquante par exemple).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Merci a toi ... J'ai déjà mis le nez dans ton code et j'en c*** ... lol

    Mais voila les soucis :

    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
    java.lang.NullPointerException
    	at javax.swing.border.BevelBorder.getHighlightOuterColor(Unknown Source)
    	at javax.swing.border.BevelBorder.paintRaisedBevel(Unknown Source)
    	at javax.swing.border.BevelBorder.paintBorder(Unknown Source)
    	at javax.swing.JComponent.paintBorder(Unknown Source)
    	at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
    	at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
    	at javax.swing.JComponent.paint(Unknown Source)
    	at org.jdesktop.swingx.JXPanel.paint(JXPanel.java:383)
    	at com.space.sp_impr2.print(sp_impr2.java:168)
    	at sun.print.RasterPrinterJob.printPage(Unknown Source)
    	at sun.print.RasterPrinterJob.print(Unknown Source)
    	at sun.print.RasterPrinterJob.print(Unknown Source)
    	at com.space.sp_impr2.creerGraphics2D(sp_impr2.java:134)
    	at com.space.sp_cgtable.sp_editer_tableau(sp_cgtable.java:807)
    	at com.space.sp_cgtable$cl_menu_item_al_1.actionPerformed(sp_cgtable.java:1339)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.AbstractButton.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.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)
    Mon code adapté (restera les @todo a remplir mais on verra quand déjà ca marchera ^^)

    Mon code courant :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    package com.space;
     
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.awt.print.PageFormat;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
     
    import org.jdesktop.jdnc.JNTable;
    import org.jdesktop.swingx.JXTitledPanel;
     
    public class sp_impr2 extends JXTitledPanel implements Printable {
     
      private BufferedImage     image;
     
      private int               columnHeaderViewPortWidth;
     
      private int               columnHeaderViewPortHeight;
     
      private int               rowViewPortWidth;
     
      private int               rowViewPortHeight;
     
      private int               columnHeaderHeight;
     
      private int               headerHeight;
     
      private int               footerHeight;
     
      private int               pageNumber;
     
      private int               numberOfRowsPerPage;
     
      private static final long serialVersionUID = 1L;
     
      JNTable                   c_list; // Mon Jtable
     
      String[]                  titres; // Mon tableau de titres 1ere ligne
     
      String[]                  entetes; // Mon tableau d'entetes 2eme ligne
     
      int[]                     corresp; // La correspondance case 1 de titre = 2 entetes
     
      sp_format_colonne[]       formats;
     
      public void creerGraphics2D( JNTable _c_list, String[] _titres, String[] _entetes, int[] _corresp, sp_format_colonne[] _formats ) {
     
        c_list = _c_list;
        titres = _titres;
        entetes = _entetes;
        corresp = _corresp;
        formats = _formats;
     
        this.add ( c_list );
     
        PrinterJob pj = PrinterJob.getPrinterJob ();
        pj.setPrintable ( this );
        if ( pj.printDialog () )
          try {
            pj.print ();
          } catch ( Exception e ) {
            e.printStackTrace ();
          }
     
      }
     
      public int print( Graphics g, PageFormat pageFormat, int pageIndex ) throws PrinterException {
     
        boolean layoutDone = false;
     
        int x = (int) Math.ceil ( pageFormat.getImageableX () );
        int y = (int) Math.ceil ( pageFormat.getImageableY () );
        int width = (int) Math.ceil ( pageFormat.getImageableWidth () );
        int height = (int) Math.ceil ( pageFormat.getImageableHeight () );
        int orientation = pageFormat.getOrientation ();
     
        if ( !layoutDone ) {
          //columnHeaderHeight = ;
          headerHeight = c_list.getTable ().getTableHeader ().getHeight ();
          footerHeight = 50;
          int rowHeight = (c_list.getTable ().getRowHeight () + c_list.getTable ().getRowMargin ());
          int rowNumber = (int) (((int) pageFormat.getHeight () - headerHeight) / rowHeight);
          // Dimension of the image.
          int imageWidth = width;
          int imageHeight = rowHeight + rowNumber * rowHeight;
          // Set the table to the proper dimension.
          Dimension oldSize = getSize ();
          setSize ( imageWidth , imageHeight );
          // Create image.
          image = new BufferedImage ( imageWidth , imageHeight , BufferedImage.TYPE_INT_RGB );
          Graphics2D g2d = image.createGraphics ();
          // Paint table into imabge.
          // maybe paintAll(g2d); ?
          paint ( g2d );
          g2d.dispose ();
          setSize ( oldSize );
          // calculate view port dimensions.
          columnHeaderViewPortWidth = imageWidth;
          columnHeaderViewPortHeight = columnHeaderHeight;
          rowViewPortWidth = imageWidth;
          int tableImageableHeightForEachPage = height - (headerHeight + columnHeaderHeight + footerHeight);
          pageNumber = Math.max ( 1 , (rowNumber * rowHeight) / tableImageableHeightForEachPage );
          numberOfRowsPerPage = tableImageableHeightForEachPage / rowHeight;
          layoutDone = true;
        }
        // We've finished printing.
        if ( pageIndex >= pageNumber ) {
          return NO_SUCH_PAGE;
        }
        // Move to imageable area.
        g.translate ( x , y );
        /** @todo Print header here. */
        g.translate ( 0 , headerHeight );
        BufferedImage columnHeaderImage = image.getSubimage ( 0 , 0 , columnHeaderViewPortWidth , columnHeaderViewPortHeight );
        g.drawImage ( columnHeaderImage , 0 , 0 , null );
        g.translate ( 0 , columnHeaderViewPortHeight );
        /** @todo Test that when the last image chuck is smaller than rowViewPortHeight */
        //int chunkHeight = Math.min(rowViewPortHeight, )
        BufferedImage rowImage = image.getSubimage ( 0 , columnHeaderViewPortHeight + pageIndex * numberOfRowsPerPage , rowViewPortWidth ,
            rowViewPortHeight );
        /** @todo Test that when the last image chuck is smaller than rowViewPortHeight */
        // In such case use something similar to that.
        //int chunkHeight = Math.min(rowViewPortHeight, image.getHeight-(columnHeaderHeight + pageIndex*rowViewPortHeight));
        //BufferedImage rowImage = image.getSubimage(0, columnHeaderViewPortHeight+pageIndex*numberOfRowsPerPage, rowViewPortWidth, chunkHeight);
        g.drawImage ( rowImage , 0 , 0 , null );
        g.translate ( 0 , rowViewPortHeight );
        /** @todo Print footer here. */
        /** @todo go back to the top of the page. */
        // Reset to origin.
        g.translate ( -x , -y );
        return PAGE_EXISTS;
     
      }
    }
    Les lignes a erreur sont celes ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    paint ( g2d );
          g2d.dispose ();


    EDIT : Apres pleins de tests toute la journée ca marche pas mieux ... Il y a quelque chose que je comprends pas ... grrrrr

    Voila maintenant UNE des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.awt.image.RasterFormatException: negative or zero height
    Je désespère ...

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    1)
    Citation Envoyé par JamesP
    EDIT : Apres pleins de tests toute la journée ca marche pas mieux ... Il y a quelque chose que je comprends pas ... grrrrr

    Voila maintenant UNE des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.awt.image.RasterFormatException: negative or zero height
    Apparement a un moment tu essaies de creer une image dont au moins l'une des dimensions est <= 0. Cela semble normal puisque tu stockes la hauteur des tetes de colonnes dans headerHeight (la hauteur de l'entete de la page) plutot que columnHeaderHeight (la hauteur des entetes de colonnes).

    2) Deja eviter de faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public int print( Graphics g, PageFormat pageFormat, int pageIndex ) throws PrinterException {
     
        boolean layoutDone = false;
    Parce que la tu vas refaire ton layout a chaque impression d'une nouvelle page, ce que tu n'as pas besoin de faire. Tu veux juste le faire une fois : la premiere fois que la metode print() est appellee pour cette impression. Par contre tu peux eventuellement synchroniser ta methode qui lance l'impression histoire d'eviter d'en avoir plusieurs qui se lancent en meme temps.

    3) En fait plutot que ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int rowNumber = (int) (((int) pageFormat.getHeight () - headerHeight) / rowHeight);
    Je voyais plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int rowNumber = getModel().getRowCount()
    Note : essaie de passer dans le code avec le deboggeur de ton IDE ou fait des impressions pour verifier de temps a autre que les valeurs et dimensions des images ne sont pas abherantes ca facilite la comprehension.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Ok merci a toi ... J'ai réussi a sortir mon tableau avec entêtes, nom et date, et numéro de page ...

    Le problème c'est que l'affichage est très FLOU et illisible ...

    Voila mon code :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    int x           = (int)Math.ceil( pageFormat.getImageableX(  ) );
        int y           = (int)Math.ceil( pageFormat.getImageableY(  ) );
        int width       = (int)Math.ceil( pageFormat.getImageableWidth(  ) );
        int height      = (int)Math.ceil( pageFormat.getImageableHeight(  ) );
        int orientation = pageFormat.getOrientation(  );
     
        scale           = width / (double)c_list.getTable(  )
                                                  .getColumnModel(  )
                                                  .getTotalColumnWidth(  );
     
        if( !layoutDone ) {
          columnHeaderHeight   = c_list.getTable(  )
                                       .getTableHeader(  )
                                       .getHeight(  );
          headerHeight         = 40;
          footerHeight         = 40;
     
          int rowHeight        = ( c_list.getTable(  )
                                         .getRowHeight(  ) + c_list.getTable(  )
                                                                   .getRowMargin(  ) );
          int rowNumber        = c_list.getModel(  )
                                       .getRowCount(  );
     
          // Dimension de l'image
          int imageWidth  = width;
          int imageHeight = headerHeight + ( rowNumber * rowHeight );
     
          // Changer la taille de la Jtable
          Dimension oldSize = getSize(  );
          setSize( imageWidth,imageHeight );
          // Créer l'image.
          image = new BufferedImage( imageWidth,imageHeight,BufferedImage.TYPE_INT_RGB );
     
          Graphics2D g2d = image.createGraphics(  );
     
          g2d.scale( scale,scale );
     
          // Ajouter le header à l'image
          c_list.getTable(  )
                .getTableHeader(  )
                .paint( g2d );
     
          g2d.translate( 0,columnHeaderHeight );
     
          // Ajouter la table à l'image
          c_list.getComponent(  )
                .paint( g2d );
          // ou paintAll(g2d);
          g2d.dispose(  );
          setSize( oldSize );
          // calculate view port dimensions.
          columnHeaderViewPortWidth    = imageWidth;
          columnHeaderViewPortHeight   = columnHeaderHeight;
          rowViewPortWidth             = imageWidth;
          rowViewPortHeight            = rowHeight;
     
          int tableImageableHeightForEachPage = height
            - ( headerHeight + columnHeaderHeight + footerHeight );
          pageNumber                   = Math.max( 
              1,
              ( rowNumber * rowHeight ) / tableImageableHeightForEachPage );
          numberOfRowsPerPage          = tableImageableHeightForEachPage / rowHeight;
          layoutDone                   = true;
        }  // end if
     
        // Fin de l'édition de la page en cours du tableau
        if( pageIndex>=pageNumber )
     
          return NO_SUCH_PAGE;
     
        g.translate( x,y );
        //On imprime le header
        g.drawString( nom,0,(int)( headerHeight / 2 ) );
     
        DateFormat dateFormat = DateFormat.getDateInstance( DateFormat.FULL,locale );
        g.drawString( 
          dateFormat.format( new Date(  ) ),
          (int)( ( 7 * width ) / 10 ),
          (int)( headerHeight / 2 ) );
        g.translate( 0,headerHeight );
     
        g.drawImage( image,0,0,null );
     
        /*BufferedImage columnHeaderImage = image.getSubimage(
           0,
           0,
           columnHeaderViewPortWidth,
           columnHeaderViewPortHeight );
           g.drawImage( columnHeaderImage,0,0,null );
           g.translate( 0,columnHeaderViewPortHeight );
         */
     
     
        /** @todo Tester ca quand le reste de l'image est plus petit que ce qui s'affiche dans une page (rowViewPortHeight)*/
        /*
           //int chunkHeight = Math.min(rowViewPortHeight, );
           //BufferedImage rowImage = image.getSubimage ( 0 , columnHeaderViewPortHeight + pageIndex * numberOfRowsPerPage , rowViewPortWidth , rowViewPortHeight );
         */
     
     
        /** @todo Tester ca quand le reste de l'image est plus grand que ce qui s'affiche dans une page (rowViewPortHeight)*/
        /*
           int chunkHeight = Math.min(
               rowViewPortHeight,
               image.getHeight(  ) - ( columnHeaderHeight + ( pageIndex * rowViewPortHeight ) ) );
           BufferedImage rowImage = image.getSubimage(
               0,
               columnHeaderViewPortHeight + ( pageIndex * numberOfRowsPerPage ),
               rowViewPortWidth,
               chunkHeight );
           g.drawImage( rowImage,0,0,null );*/
        g.translate( 0,rowViewPortHeight );
        // On imprime le footer
        g.drawString( "Page : " + ( pageIndex + 1 ),( (int)width / 2 ) - 35,rowViewPortHeight );
        //Retour en haut de la page
        g.translate( -x,-y );
    J'ai commenté certaines parties pour mes premiers tests ...

    Je vais essayer de scanner le résultat pour que tu voit ! Mais avec une technique tout autre trouvée sur les forums que voila :

    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
    Graphics2D g2 = (Graphics2D) sp_g;
        g2.setColor ( Color.black );
        int fontHeight = g2.getFontMetrics ().getHeight ();
        int fontDescent = g2.getFontMetrics ().getDescent ();
     
        // laisser de l'espace pour le numero de page 
        double pageHeight = sp_pageformat.getImageableHeight () - fontHeight;
        double pageWidth = sp_pageformat.getImageableWidth ();
        double tableWidth = (double) c_list.getTable ().getColumnModel ().getTotalColumnWidth ();
        double scale = 1;
        if ( tableWidth >= pageWidth ) {
          scale = pageWidth / tableWidth;
        }
        double headerHeightOnPage = c_list.getTable ().getTableHeader ().getHeight () * scale;
        double tableWidthOnPage = tableWidth * scale;
        double oneRowHeight = (c_list.getTable ().getRowHeight () + c_list.getTable ().getRowMargin ()) * scale;
        int numRowsOnAPage = (int) ((pageHeight - headerHeightOnPage) / oneRowHeight);
        double pageHeightForTable = oneRowHeight * numRowsOnAPage;
        int totalNumPages = (int) Math.ceil ( ((double) c_list.getTable ().getRowCount ()) / numRowsOnAPage );
        if ( sp_pageidx >= totalNumPages )
          return NO_SUCH_PAGE;
     
        g2.translate ( sp_pageformat.getImageableX () , sp_pageformat.getImageableY () );
        // en bas au centre 
        g2.drawString ( "Page: " + (sp_pageidx + 1) , (int) pageWidth / 2 - 35 , (int) (pageHeight + fontHeight - fontDescent) );
        g2.translate ( 0f , headerHeightOnPage );
        g2.translate ( 0f , -sp_pageidx * pageHeightForTable );
        // si cette partie de la page est plus petite 
        // que la taille disponible, alors découper les contours appropriés 
        if ( sp_pageidx + 1 == totalNumPages ) {
          int lastRowPrinted = numRowsOnAPage * sp_pageidx;
          int numRowsLeft = c_list.getTable ().getRowCount () - lastRowPrinted;
          g2
              .setClip ( 0 , (int) (pageHeightForTable * sp_pageidx) , (int) Math.ceil ( tableWidthOnPage ) , (int) Math
                  .ceil ( oneRowHeight * numRowsLeft ) );
        }
        // sinon découper la zone disponible toute entière 
        else {
          g2.setClip ( 0 , (int) (pageHeightForTable * sp_pageidx) , (int) Math.ceil ( tableWidthOnPage ) , (int) Math.ceil ( pageHeightForTable ) );
        }
        g2.scale ( scale , scale );
     
        /* Créer tableau */
     
        c_list.getComponent ().paint ( g2 );
     
        /* Fin créer tableau */
     
        // dessiner les entêtes en haut 
        g2.scale ( 1 / scale , 1 / scale );
        g2.translate ( 0f , sp_pageidx * pageHeightForTable );
        g2.translate ( 0f , -headerHeightOnPage );
        g2.setClip ( 0 , 0 , (int) Math.ceil ( tableWidthOnPage ) , (int) Math.ceil ( headerHeightOnPage ) );
        g2.scale ( scale , scale );
        c_list.getTable ().getTableHeader ().paint ( g2 );
        return Printable.PAGE_EXISTS;
    L'impression est NICKEL, sauf pour le HEADER du JTable qui apparement supporte mal la mise à l'échelle ... Sur cette méthode je n'arrive pas non plus a ajouter le nom et la date tout en haut des pages ...

    J'aimerais que l'on garde ce que l'on a fait, mais peut être en utilisant "le truc" qui fait imprimer net sur le code trouvé dans les forums ...

    J'espère que tu m'a compris ...

    MErci a toi !!!

    ADIT : pices jointes pour exemples !

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le flou vient probablement d'une mises a l'echelle de l'image. Bizarre ca ne m'etais jamais arrive auparavant. As-tu essaye de faire varier les indices de rendu (nottament RenderingHints.KEY_INTERPOLATION et RenderingHints.KEY_ANTIALIASING) sur le graphics founis a print() (note : le caster en Graphics2D pour effectuer cette operation).

    Dans l'autre cas on a une peinture directe du composant sur la surface d'impression, comme mentionnee plus haut. C'est ce que j'utilise egalement dans le topic que je t'ai indique sur l'impression de d'un JEditorPane sur plusieurs pages. Une fois que tu as compris le principe des decalages et des clips, c'est mieux en effet d'utiliser ce genre de technique, ca eviter d'avoir des images intermediaires en memoire.

    Citation Envoyé par bouye
    - dans le second cas on peut alors utiliser la methode paint() ou print() de la table et jouer avec les methodes translate() et setClip() du graphics avec les valeurs appropriees de maniere a ne dessiner que des "vues" de la table aux bon endroits :
    - une vue sur les tete de colonnes sur chaque page.
    - une vue sur les lignes rowIndexForPageIndex -> rowIndexForPageIndex + numberOfRowsPerPage pour la page pageIndex donnee.
    Il est possible que les entetes de colonnes s'affiche pardessus l'entete de page sans faire expres suite a une erreur de calcul, de decallage ou qu'elles ne s'affichent pas suite a une erreur de clip, difficile a dire comme cela sans pouvoir tester. En tout cas sur le second scan il semble manquer un espace reserve a l'entete de page (est-ce qu'on revient bien a la bonne origine en fin d'impression via les translations opposees de celles effectues ?????)
    J'ignore ce pourquoi les tetes de colonnes ne s'affiche pas correctement cependant. Essaie d'appeler print() ou paintAll() plutot que paint() pour voir. Essaie aussi de voir si tu peux desactiver le double-buffer sur ce composant durant le temps de l'impression (setDoubleBuffered(false)); pour voir si ca change quelques chose.

    Note : consernant tes labels tronques rappelle toi que tu peux specifier une police plus petite pour le temps de l'impression.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    D'accord merci ... a ton avis puis-je appliquer la seconde méthode a ce que tu as commencé a m'expliquer ? Si oui comment ?

    Je t'avoue que j'en perd mon latin avec tout ca et ca serais bien que j'ai des résultats ... Car j'arrete pas de me casser le crane mais j'avance pas beaucoup malheureusement !

    Merci a toi !

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Arf mais je ne peux pas faire ton travail a ta place (et encore moins gratuitement) juste t'indiquer des pistes et des solutions que tu devras adapter toi-meme. D'autant plus que je n'ai pas acces aux classes que tu manipules et ne peut pas faire d'essaies par moi-meme (ni n'ai le temps de le faire de toute maniere).

    Une lecture du code plus attentive montre qu'ils se contentent de reserver un espace en bas de page pour afficher le numero de la page. A toi donc de t'inspirer du code precedent (celui qui utilise l'image) pour reserver un espace en haut de la page. Enfin si le probleme avec les entetes de colonnes persistes tu peux faire un mix des deux solution : a savoir peindre les entetes de colones (et uniquement elles) dans une image et reproduire cette image sur chaque page. Fait des tests avec les indices de rendu indiques. Et, comme indique precedement, tu peux te gagner du temps (et economiser du papier) en produisant des images a partir du Printable, histoire de simuler une impression - voir le code sur les JEditorPane - quoique je soupconne que les problemes d'affichage des entetes de colonnes peuvent ne pas apparaitre quand on fait ce genre de chose.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    [COLOR="Purple"]Ok lol, je ne te demandais pas de faire mon job, loin de la !

    Je vas bien m'en sortir avec ses printers ... grrr ...

    Bon ben je vais retourner trimer la dessus aujourd'hui ...

    Merci pour ton aide

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 129
    Points : 81
    Points
    81
    Par défaut
    Hmmm je comprend pas j'ai adapté le code pour pouvoir créer des images plutot qu'imprimer (comme sur le post que bouye cite ci avant)... et cela marche parfaitement quand l'image a une taille de 800... Mais j'ai essayé avec d'autres tailles inférieures et là c'est la foire les lignes sont coupées n'importe ou...

    Pourtant le programme est censé s'adapter à la taille du papier... je suis perdu

    De plus j'ai enlevé le footer (n° de page) et les header de la table parce que sinon au bout de quelques pages, il y avait un décallage d'un pixel.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 129
    Points : 81
    Points
    81
    Par défaut
    Finalement j'y suis arrivé, toujours en mixant un peu avec ce topic (http://www.developpez.net/forums/sho...d.php?t=53139). J'ai donc un header et un footer en HTML et une JTable au milieu.

    Mais pour cette dernière j'ai du laisser tomber le scale et pour la hauteur d'une ligne je l'ai simplifiée :

    double oneRowHeight = c_list.getTable ().getRowHeight ()

    Le c_list.getTable ().getRowMargin ()) est de trop pour moi, ça fesait tout décaler...

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

Discussions similaires

  1. [Swing][Graphics2D] dessiner une flèche
    Par Galima dans le forum 2D
    Réponses: 13
    Dernier message: 03/12/2011, 23h31
  2. [PrinterJob][Graphics2D] Multi pages
    Par fady005 dans le forum 2D
    Réponses: 18
    Dernier message: 26/06/2009, 02h53
  3. [Debutant] [Graphics2d] coordonnees d'un "shape"
    Par Javatator dans le forum 2D
    Réponses: 6
    Dernier message: 10/11/2004, 09h16
  4. Graphics2D setBackground
    Par cyber_jad dans le forum 2D
    Réponses: 2
    Dernier message: 20/10/2004, 16h41
  5. [SWING]Bouton et Graphics2D
    Par mush_H dans le forum 2D
    Réponses: 3
    Dernier message: 02/07/2004, 15h35

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