[Java] interférences entre OpenDialog et impression de jFrame (résolu)

interférences entre OpenDialog et impression de jFrame (résolu) [Java] - Java - Programmation

Marsh Posté le 27-07-2009 à 15:10:31    

Bonjour,
 
je développe un programme pour les "nolifes" qui jouent au JDR, ou plutôt pour un jeu en particulier. Le principe est de générer toutes les caractéristiques d'un personnages à partir de données sélectionnables en jComboBox. Je gère aussi la sauvegarde des personnages générés et donc leur réouverture. Il ne me manque(ait) que la partie impression.
 
En transformant (de façon mineure sur les paramètres initiaux comme le fitintoPage) une classe trouvée sur internet (MPanelPrinter by Mep) j'ai donc réussi à imprimer à l'échelle mon "formulaire" mais le résultat n'est malheureusement pas  bon :
 
Si je lance l'impression juste après la génération de personnage alors l'impression fonctionne à ceci près que l'arrière plan n'apparait pas (BG obtenu par le code f.detContentPane(new Background()); où f est la jFrame principale et Background une classe extends JPanel dont la seul méthode est paintComponent(graphics g)) [= 1er Pb]
Par contre si j'ai eu le malheur d'ouvrir une fenêtre windows (genre filechooser.showOpenDialog) pour ouvrir ou sauvegarder un fichier alors ça devient n'importe quoi : la partie formulaire s'imprime 2 fois sur la feuille, décalés de quelques pixels en hauteur comme en largeur, et le coin en haut à gauche (j'imprime en paysage) voit s'accumuler la dite fenêtre windows et des bribes du formulaire lui même rendant le tout absolument informe et illisible... et cette fois l'arrière plan est bien imprimé  :??:  
Encore plus drôle, quand j'imprime la Feuille de Perso vide à l'ouverture du programme, alors on obtient seulement l'accumulation de 2 formulaires + l'arrière plan (alors que si juste après je génère le perso, je retroune dans le cas 1).
 
Si quelqu'un y comprend quelque chose ... :pt1cable:  
 
pour la question principale (l'interférence des Dialog avec l'impression), je pensait qu'il suffirait de trouver le moyen de faire une sorte de jFrame.dispose() des fenêtres windows mais je n'arrive à rien.
 
merci d'avance si vous pouvez réorienter mes recherches ou me fournir quelques indices.
 
PS: j'ai oublié de préciser que je travaille sur NetBeans avec les fausses facilités que cela implique et que mes tests d'impression sont effectué avec PDFcreator pour économiser le papier (ça a peut-être une influence, on ne sait jamais). Il faut également préciser que le "formulaire" cité est une jFrame contenant un jPanel, lui-même en contenant d'autres composées principalement de jLabel, jTextFields et autres jTextPane et jButton...


Message édité par L'Ampli le 31-07-2009 à 09:50:47
Reply

Marsh Posté le 27-07-2009 à 15:10:31   

Reply

Marsh Posté le 28-07-2009 à 14:38:12    

pour faciliter la compréhension voilà le code de la class MPanelPrinter écrite par Mep (source Java-code je crois)
 

Code :
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.GridBagLayout;
  6. import java.awt.RenderingHints;
  7. import java.awt.print.PageFormat;
  8. import java.awt.print.Paper;
  9. import java.awt.print.Printable;
  10. import java.awt.print.PrinterException;
  11. import java.awt.print.PrinterJob;
  12. import java.util.Vector;
  13. import javax.swing.*;
  14. public class MPanelPrinter implements Printable
  15. {
  16.     public MPanelPrinter(JPanel panel)
  17.     {
  18.         documentTitle = "";
  19.         this.panel = panel;
  20.         initPrintablePanel();
  21.     }
  22.     public void initPrintablePanel()
  23.     {
  24.        showPrintZone = false;
  25.        fitIntoPage = true;
  26.        wrapComponent = false;
  27.        printJob = PrinterJob.getPrinterJob();
  28.        pageFormat = printJob.defaultPage();
  29.        pageFormat.setOrientation(0);
  30.     }
  31.     public void setOrientation(int orientation)
  32.     {
  33.         pageFormat.setOrientation(orientation);
  34.     }
  35.     public void setPrintZoneVisible(boolean status)
  36.     {
  37.         showPrintZone = status;
  38.     }
  39.     public void setWrapComponent(boolean status)
  40.     {
  41.         wrapComponent = status;
  42.     }
  43.     public void setFitIntoPage(boolean status)
  44.     {
  45.         fitIntoPage = status;
  46.     }
  47.     public int getPageWidth()
  48.     {
  49.         return (int)pageFormat.getImageableWidth();
  50.     }
  51.     public double getMarginTop ()
  52.     {
  53.         return pageFormat.getImageableY();
  54.     }
  55.     public double getMarginLeft ()
  56.     {
  57.         return pageFormat.getImageableX();
  58.     }
  59.     public void setLRMargins(int margin)
  60.     {
  61.         Paper paper = pageFormat.getPaper();
  62.         paper.setImageableArea(paper.getImageableX() - (double)(margin / 2), paper.getImageableY(),paper.getImageableWidth() + (double)(margin / 2), paper.getImageableHeight());
  63.         pageFormat.setPaper(paper);
  64.     }
  65.     public void setTBMargins(int margin)
  66.     {
  67.         Paper paper = pageFormat.getPaper();
  68.         paper.setImageableArea(paper.getImageableX(), paper.getImageableY() - (double)(margin / 2), paper.getImageableWidth(), paper.getImageableHeight() + (double)(margin / 2));
  69.         pageFormat.setPaper(paper);
  70.     }
  71.     public void setDocumentTitle(String title)
  72.     {
  73.         documentTitle = title;
  74.     }
  75.     public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException
  76.     {
  77.         Dimension tailleDoc = panel.getSize();
  78.         double hauteurDocu = tailleDoc.getHeight();
  79.         double hauteurPage = pf.getImageableHeight();
  80.         double largeurDocu = tailleDoc.getWidth();
  81.         double largeurPage = pf.getImageableWidth();
  82.         int totalNumPages = (int)Math.ceil(hauteurDocu / hauteurPage);
  83.         if(wrapComponent){
  84.             totalNumPages = taillePages.size();
  85.             }
  86.         else{
  87.             if(fitIntoPage){
  88.                 totalNumPages = 1;
  89.             }
  90.         }
  91.         double scaleX = largeurPage / largeurDocu;
  92.         double scaleY = hauteurPage / hauteurDocu;
  93.         if(pageIndex >= totalNumPages){return 1;}
  94.         Graphics2D g2d = (Graphics2D)g;
  95.         g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
  96.         g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  97.         g2d.translate(pf.getImageableX(), pf.getImageableY());
  98.         if(fitIntoPage){
  99.             double ratio = Math.min(scaleX, scaleY);
  100.             g2d.scale(ratio, ratio);
  101.         }
  102.         else {
  103.             if(wrapComponent){
  104.                 if(pageIndex > 0){
  105.                     g2d.translate(0.0D, -((Double)taillePages.get(pageIndex - 1)).doubleValue());
  106.                     }
  107.             }
  108.             else{
  109.                 g2d.translate(0.0D, (double)(-pageIndex) * hauteurPage);
  110.             }
  111.         }
  112.         panel.paintAll(g2d);
  113.         if(wrapComponent){
  114.             double hauteurBlanc = ((Double)taillePages.get(pageIndex)).doubleValue();
  115.             g2d.setColor(Color.WHITE);
  116.             g2d.fillRect(0, (int)hauteurBlanc, (int)largeurPage, (int)hauteurBlanc + (int)hauteurPage);
  117.         }
  118.         if(wrapComponent){
  119.             if(pageIndex > 0)
  120.             g2d.translate(0.0D, ((Double)taillePages.get(pageIndex - 1)).doubleValue());
  121.         }
  122.         else{
  123.             g2d.translate(0.0D, (double)pageIndex * hauteurPage);
  124.         }
  125.         return 0;
  126.     }
  127.     public void print()
  128.     {
  129.         printJob.setPrintable(this, pageFormat);
  130.         try
  131.         {
  132.             if(printJob.printDialog())
  133.             {
  134.                 if(wrapComponent)
  135.                     calculatePages();
  136.                 Paper paper = pageFormat.getPaper();
  137.                 Paper save = pageFormat.getPaper();
  138.                 paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
  139.                 pageFormat.setPaper(paper);
  140.                 printJob.setPrintable(this, pageFormat);
  141.                 printJob.print();
  142.                 pageFormat.setPaper(save);
  143.             }
  144.         }
  145.         catch(PrinterException pe)
  146.         {
  147.             System.out.println("Erreur lors de l'impression du document: " + toString());
  148.         }
  149.     }
  150.     private void calculatePages()
  151.     {
  152.         taillePages = new Vector();
  153.         double hauteurPage = pageFormat.getImageableHeight();
  154.         double hauteurTotal = 0.0D;
  155.         double hauteurCumul = 0.0D;
  156.         for(int i = 0; i < panel.getComponentCount(); i++)
  157.         {
  158.             int gridBagInsets = 0;
  159.             if(panel.getLayout() instanceof GridBagLayout)
  160.             gridBagInsets = ((GridBagLayout)panel.getLayout()).getConstraints(panel.getComponent(i)).insets.bottom + ((GridBagLayout)panel.getLayout()).getConstraints(panel.getComponent(i)).insets.top;
  161.             double hauteurComponent = panel.getComponent(i).getSize().getHeight() + (double)gridBagInsets;
  162.             if(hauteurComponent > hauteurPage)
  163.             {
  164.                 wrapComponent = false;
  165.                 return;
  166.             }
  167.             hauteurTotal += hauteurComponent;
  168.             if(hauteurTotal > hauteurPage)
  169.             {
  170.                 hauteurTotal -= hauteurComponent;
  171.                 hauteurCumul += hauteurTotal;
  172.                 taillePages.add(new Double(hauteurCumul));
  173.                 hauteurTotal = hauteurComponent;
  174.             }
  175.         }
  176.         hauteurCumul += hauteurTotal;
  177.         taillePages.add(new Double(hauteurCumul));
  178.     }
  179.     private JPanel panel;
  180.     private boolean showPrintZone;
  181.     private boolean fitIntoPage;
  182.     private boolean wrapComponent;
  183.     private PageFormat pageFormat;
  184.     private PrinterJob printJob;
  185.     private Vector taillePages;
  186.     private String documentTitle;
  187.     public static final int PORTRAIT = 1;
  188.     public static final int LANDSCAPE = 0;
  189. }


 
en ce qui concerne l'appel, c'est tout simplement:
 

Code :
  1. MPanelPrinter printP = new MPanelPrinter(this);
  2. printP.print();


 
où this désigne la classe Ecran extends JPanel qui contient notamment la méthode suivante:
 

Code :
  1. public static void affiche(){
  2.     JFrame f = new JFrame ("Nouveau Perso" );
  3.     [...]
  4.     f.setContentPane(new Background());
  5.     JComponent compo = new Ecran();
  6.     f.add(compo)
  7.     [...]
  8.     fenetre=f; // fenetre est une JFrame statique définie précédemment dans la classe
  9. }

Reply

Marsh Posté le 31-07-2009 à 09:49:46    

j'ai résolu ("contourné" serait plus juste) mon problème en créant une image de ma fenêtre et en l'insérant avec setContentPane() dans un panel supplémentaire et temporaire qui sert de base pour l'impression.
 
dsl pour le dérangement =)
 
PS: j'ai toujours pas trouvé/compris la cause du problème d'interférence soit dit en passant...


Message édité par L'Ampli le 03-08-2009 à 15:05:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed