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

Composants Java Discussion :

Changement de police lors de l'impression


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut Changement de police lors de l'impression
    Bonjour !

    J'essaie d'imprimer un JTextPane (qui interprète mon texte en html). J'ai donc créé une classe qui implémente Printable et dans la méthode print(), après translation et remise à l'échelle, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monJTextPane.print(leGraphicsEnParamètreDePrint)
    Mais même en changeant la fonte du graphics en amont, ce n'est pas la bonne à l'impression. Alors que si j'affiche monJTextPane dans une JFrame pendant la méthode je constate qu'il est bien construit, avec la bonne police...

    Je n'utilise que la police "générale" monospaced, c'est pas la plus dure à gérer pourtant !

    J'ai essayé en créant une image à partir du JTextPane pour la dessiner sur le graphics de l'impression mais, si la fonte est bien monospace, la qualité est exécrable genre illisible. (Ce qui est incompréhensible c'est que pour avoir l'image, je fais aussi un monJTextPane.print(g) sauf que g est lié à une BufferedImage)

    Hum... étrange... Je viens de lancer un test pour vérifier que je vous dit bien tout, que je n'ai rien loupé d'important. Je switch entre la méthode "par l'image" et la méthode "par le paint" et le résultat est : la 1ère page comme si c'était par l'image et la 2nde comme je m'y attendais (claire mais décalée à cause du changement de police). Je relance le programme sans rien changer et là le résultat est "normal". Etonnant, non ?

    Merci,

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    Bonjour !

    Comme personne n'a de réponse je vais synthétiser mon problème :
    Le texte html interprété par mon JTextPane s'affiche bien quand le Graphics sur lequel il est dessiné provient de lui-même (logique) ou d'une BufferedImage. Mais quand le Graphics provient d'un PrinterJob, les balises de gras sont interprétées mais pas les balises de gestion des polices (qui, je viens d'avoir une illumination, sont gérées par CSS grâce à l'objet StyleSheet).

    Est-il possible que le CSS soit géré par JTextPane seulement dans certains environnements graphiques ?

    Petite question provoquée par mes tests : pourquoi, lorsque je crée un JPanel, son Graphics est null ?

    Merci

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Sinono tu ttriches, tu fais le paint sur une image, et ensuite tu balance l'image sur les graphics du printer ^^.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Une autre possibilite pour ton probleme de CSS : il est possible que le rendu soit effectue en plusieurs passes ou differe ce qui de toute maniere semble logique pour l'utilisation d'un CSS.

    Citation Envoyé par Narah Voir le message
    Bonjour !
    Petite question provoquée par mes tests : pourquoi, lorsque je crée un JPanel, son Graphics est null ?
    Parce que !
    Et il ne faut pas utiliser le Graphics retourne par getGraphics()
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    Citation Envoyé par sinok Voir le message
    Sinono tu ttriches, tu fais le paint sur une image, et ensuite tu balance l'image sur les graphics du printer ^^.
    Déjà testé, la résolution de l'image est trop mauvaise, on ne peut rien lire... Mais si tu connais un moyen de garder la résolution de l'image dans le drawImage, la solution me convient !

    Citation Envoyé par bouye Voir le message
    Une autre possibilite pour ton probleme de CSS : il est possible que le rendu soit effectue en plusieurs passes ou differe ce qui de toute maniere semble logique pour l'utilisation d'un CSS.
    là j'ai pas tout compris ^^', c'est logique que le CSS ne donne pas toujours la même chose ? Pourquoi on l'utilise alors ?

    Citation Envoyé par bouye Voir le message
    Parce que !
    Et il ne faut pas utiliser le Graphics retourne par getGraphics()
    Bien ! Je m'en souviendrais !

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Parceque la page est chargée d'abord et le CSS est appliqué ensuite et que cet ensuite, ça peut être APRES que ta page ait été imprimée suivant comment s'enchainent tes appels pour lancer l'impression par rapport à l'EDT (mais il s'agit juste là d'une hypothèse).

    D'autres composants tels que le JSlider (ou pour être précis son UI) font une utilisation intensive de SwingUtilities.invokeLater() contrairement à d'autres composants dont la vue est modifiée intantanément. C'est pour cela qu'il est difficile d'utiliser un JSlider comme renderer / editor d'une JTable contrairement à un JLabel ou une JCheckBox 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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    Citation Envoyé par bouye Voir le message
    Parceque la page est chargée d'abord et le CSS est appliqué ensuite et que cet ensuite, ça peut être APRES que ta page ait été imprimée suivant comment s'enchainent tes appels pour lancer l'impression par rapport à l'EDT (mais il s'agit juste là d'une hypothèse).
    Si ton hypothèse était juste, est-ce qu'un Thread.sleep() ou un Thread.yield() résoudrait le problème ?

    En attendant, je peux toujours faire les tests...

    à+

    Edit : l'ajout de Tread.yield() juste après editeur.paint(g2d) n'est pas concluant, il semblerait qu'il n'y ai pas d'autre thread en cours. A moins qu'il faille le placer ailleurs mais je ne vois pas où...

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Alors deja : ON NE FAIT JAMAIS DE THREAD.SLEEP() DANS L'EDT

    Ensuite une fois la mise en place de la plage et de la police, ALORS utilise SwingUtilities.invokeLater() ou un Timer Swing pour faire une pause pour lancer l'impression plus tard. Tu auras alors peut-etre plus de chances d'obtenir le bon resultat (et encore). Il est possible que cela t'oblige a utiliser un second text pane different de celui present a l'ecran pour eviter que le changement de police ne soit visible a l'utilisateur.
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    Citation Envoyé par bouye Voir le message
    Alors deja : ON NE FAIT JAMAIS DE THREAD.SLEEP() DANS L'EDT
    Pourquoi ? Je commence à me renseigner sur l'EDT et les thread (j'avoue, je n'en avais jamais entendu parlé avant ) et je ne comprends pas les conséquences d'un Thread.sleep() dans l'EDT...

    Citation Envoyé par bouye Voir le message
    Ensuite une fois la mise en place de la plage et de la police, ALORS utilise SwingUtilities.invokeLater() ou un Timer Swing pour faire une pause pour lancer l'impression plus tard. Tu auras alors peut-etre plus de chances d'obtenir le bon resultat (et encore). Il est possible que cela t'oblige a utiliser un second text pane different de celui present a l'ecran pour eviter que le changement de police ne soit visible a l'utilisateur.
    L'utilisateur n'est pas censé voir le résultat avant l'impression de toutes façons. J'affiche vite fait la fenêtre au début de l'impression pour ne pas récupérer une page blanche.
    Bon, je laisse le code de mon Printable (il est créé dans un Pageable) et je vais essayer de défricher tout ça.

    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
    public class PageAImprimer implements Printable{
        protected TraitEditorPane editeur;
        protected JFrame f;
     
        /**
         * Constructeur
         * @param pg : la page que l'on veut imprimer
         * @param f : la fenêtre dans laquelle on affichera le panel (nécessaire pour le créer réellement)
         */
        public PageAImprimer(Page pg, JFrame f) {
            if (pg != null)
                this.editeur = pg.creerEditeur();
            else
                this.editeur = null;
            this.f = f;
        }
     
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (editeur == null)
                return Printable.NO_SUCH_PAGE;
            JPanel affiche = new JPanel();
            affiche.setLayout(new BorderLayout());
            affiche.add(new JLabel("        Page : "+(pageIndex+1)),BorderLayout.PAGE_START);
            JScrollPane scroll = new JScrollPane(editeur);
            scroll.setPreferredSize(new Dimension(120,40));
            affiche.add(scroll, BorderLayout.PAGE_END);
            f.setContentPane(affiche);
            f.pack();
            if (f.isVisible())
                f.repaint();
            else
                f.setVisible(true);
            // Récupère les dimensions de la zone imprimable et de l'image
            double xGauche      = pageFormat.getImageableX();
            if (xGauche<0)
                xGauche = 0;
            double yHaut        = pageFormat.getImageableY();
            if (yHaut<0)
                yHaut = 0;
            double largeurDocu  = editeur.getWidth();
            double largeurPage  = pageFormat.getImageableWidth();
            double hauteurDocu  = editeur.getHeight();
            double hauteurPage  = pageFormat.getImageableHeight();
     
            Graphics2D g2d = (Graphics2D)graphics;
            g2d.setFont(editeur.getFont());
             //change la couleur de fond en blanc
            g2d.setColor(Color.white);
            g2d.fillRect((int)xGauche, (int)yHaut, (int)largeurPage, (int)hauteurPage);
            if (pageFormat.getOrientation()==PageFormat.PORTRAIT)
            {
                if (largeurDocu>largeurPage || hauteurDocu>hauteurPage)
                {
                    double scaleX = largeurPage / largeurDocu;
                    double scaleY = hauteurPage / hauteurDocu;
                    double ratio = Math.min(scaleX, scaleY);
                    g2d.scale(ratio, ratio);
                }
            }
            else
            {
                if (largeurDocu>hauteurPage || hauteurDocu>largeurPage)
                {
                    double scaleX = largeurPage / largeurDocu;
                    double scaleY = hauteurPage / hauteurDocu;
                    double ratio = Math.min(scaleX, scaleY);
                    g2d.scale(ratio, ratio);
                }
            }
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.translate(xGauche, yHaut);
            editeur.paint(g2d);
     
            return Printable.PAGE_EXISTS;
        }
    }

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Qu'est ce que l'Event Dispatch Thread (EDT) ?
    Lors d'un traitement long, l'affichage se fige, que faire ?
    Comment exécuter un traitement plus tard dans l'EDT ?

    Quand tu met l'EDT en pause en utilisant sleep(), et contrairement à ce que pensent la plupart des gens, il ne se passe rien... et je veux dire vraiment RIEN : la GUI est bloquée, aucun réaffichage, aucune propagation d'événement, aucun traitement se déroulant durant l'EDT, que dalle.
    Donc ce n'est pas ainsi que tu peux permettre de temporiser le temps que ton JTextPane soit dans un état correct.
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    ça a été mon premier reflexe ! ^^

    Citation Envoyé par bouye Voir le message
    Quand tu met l'EDT en pause en utilisant sleep(), et contrairement à ce que pensent la plupart des gens, il ne se passe rien... et je veux dire vraiment RIEN : la GUI est bloquée, aucun réaffichage, aucune propagation d'événement, aucun traitement se déroulant durant l'EDT, que dalle.
    Donc ce n'est pas ainsi que tu peux permettre de temporiser le temps que ton JTextPane soit dans un état correct.
    En fait, c'est logique puisque je dit au thread qui gère le réaffichage, la propagation d'événements, etc de dormir ! Mais si je fais un yield(), j'attends que les autres thread aient fini, non ? Donc si c'était un autre thread qui gérait le CSS ça aurait du marcher ? Comme ce n'est pas le cas, j'en conclu que c'est l'EDT qui ne fait pas tout ou bien pas dans le bon ordre.
    Mais je n'ai pas accès au moment où mon jtextpane utilise le CSS... comment lui dire de le faire au bon moment ? (si c'est possible...)

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ensuite une fois la mise en place de la plage et de la police, ALORS utilise SwingUtilities.invokeLater() ou un Timer Swing pour faire une pause pour lancer l'impression plus tard.
    A voir si cela change quelque chose (rappel : je ne fais que supposer que le CSS est appliqué durant une passe ultérieure).
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 26
    Par défaut
    Bon, finalement j'ai changé de technique. J'ai découvert que si mes images étaient aussi flous, c'étaient parce que quand je les mettais à l'échelle de la page, je devais les agrandir. Du coup, je les construis plus grandes et ça marche (presque) bien avec la technique évoquée par sinok.

    Ce presque étant de mon ressort, on va dire : problème résolu !


    Merci à toi bouye de m'avoir renseignée.

Discussions similaires

  1. Problème de changement de bac lors d'une impression
    Par basic83 dans le forum AS/400
    Réponses: 4
    Dernier message: 14/03/2012, 11h16
  2. [PPT-2007] Changement de l'alignement de police lors d'insertion de slides
    Par Opatija dans le forum Powerpoint
    Réponses: 2
    Dernier message: 20/05/2011, 10h55
  3. Changement de CSS lors d'un mouseover
    Par jeff37 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 27/05/2005, 16h03
  4. Changement de FOCUS lors d'un changement d'application
    Par gmc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 01/02/2005, 17h57
  5. Faire disparaître menu lors de l'impression
    Par jackrabbit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 19/12/2004, 20h56

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