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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    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 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    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 éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    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 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    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 éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    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 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    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

+ 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