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

Documents Java Discussion :

PrintJob.print évènement terminé!


Sujet :

Documents Java

Vue hybride

toutatafr PrintJob.print évènement... 22/12/2010, 00h30
tchize_ vous avez juste à mettre le... 22/12/2010, 08h16
hwoarang Salut, Si je me rappelle... 22/12/2010, 09h22
toutatafr Merci pour vos réponses ... 22/12/2010, 10h42
tchize_ vous ne devriez justement pas... 22/12/2010, 11h36
hwoarang Ca n'a rien de "sale". Ca... 22/12/2010, 12h53
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut PrintJob.print évènement terminé!
    Bonjour,

    Ayant un grand nombre de JPanel à imprimer, je souhaite libérer des ressources après l'impression de chaque JPanel.

    Voici en résumé à quoi ressemble le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // l'appelle de print invoquera la méthode d'impression de monJPanel
    try { pj.print(); } 
    catch (PrinterException pe) {;}
    // l'impression est terminée donc je libère le panel:
    monJPanel.finalize();
    monJPanel = null;
    Mon problème est le suivant:
    • soit je ne libère pas monJPanel et tout s'imprime correctement jusqu'à ce que je tombe en out of memory.
    • soit je libère monJPanel mais j'imprime alors une page vierge car je le libère visiblement trop tôt.


    Ma question est la suivante:
    • existe-t-il un évènement à trapper qui permet de savoir que l'impression est terminée?

    Question subsidiare:
    • Pouvez-vous m'indiquer un tutoriel précis sur la façon dont java traite cette méthode print qui visiblement s'exécute dans un thread indépendant?


    Pour info:
    • Je n'ai pas trouvé de listener approprié (peut-être ai-je mal cherché? surement du reste puisque je n'ai pas trouvé de solution!)
    • J'ai essayé de tester le retour de la méthode public int print(Graphics g, PageFormat pf, int pageIndex) en attendant le NO_SUCH_PAGE (mais ce n'est pas concluant)
    • La seule solution que j'entrevois serait de tester le hashcode() du monJPanel utilisé dans la méthode public int print(Graphics g, PageFormat pf, int pageIndex) et de le libérer quand la valeur du hashcode() change (et donc qu'on commence l'impression du monJPanel suivant). Mais ça reste de la bidouille empirique...

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vous avez juste à mettre le panel éventuellement à null. Le GC fera son boulot en temps et en heure. Si le panel n'est pas nettoyé, c'est que vous gardez ailleurs une référence sur ce panel. on appelle JAMAIS les méthode finalize soit même, elle sont destinée au gc, pour etre appelées quand l'objet est libéré.

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Salut,

    Si je me rappelle bien les tests que j'avais fait à l'époque, la fonction void print(Graphics graphics, PageFormat pageFormat, int pageIndex) est appelée quand tu fais printJob.print()

    Autrement dit, au retour de printJob.print(), la tache est deja terminée. Par contre, comme précisé precedemment (ainsi que par la javadoc), c'est le garbage collector qui appelle finalize. Il faut simplement mettre ton jpanel à null et t'assurer qu'il n'y a plus de reference sur lui (s'il est inclu dans un autre container, ne pas oublier le remove).

    Au passage, je ne sais pas si tu connais mais il est possible de lancer la machine virtuelle avec l'argument -Xmx pour augmenter la memoire allouée à celle-ci et eviter les out of memory.

    a+

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut
    Merci pour vos réponses

    Pour être plus précis, je n'appelle pas la méthode finalize(), mais finalizeMe() qui se contente de mettre à null tous les attributs du JPanel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      public void finalizeMe() {
        // planbay et selection sont aussi des extends JPanel dont la méthode finalizeMe() met à null les attributs
        selection.finalizeMe();
        planbay.finalizeMe();
        selection = null;
        planbay = null;
      }
    Je savais qu'on pouvait allouer plus de mémoire à la JVM, mais il me semble que ce n'est pas très propre (est-ce une méthode courante?) et je préfèrerais comprendre où est mon erreur.

    Si vous avez d'autres pistes je suis preneur.
    Je vais déjà m'assurer de nouveau qu'aucun autre composant ne fait référence à monJPanel.
    Merci

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vous ne devriez justement pas avoir besoin de mettre à null les attributs du panel, il seront libérés en meme temps que le panel le sera. Ce que vous faite est une bidouille pour retarder le problème (vous allégez le poids de l'objet qui traine en mémoire, alors que le problème est justement d'éviter qu'il traine).

    Bref, retirer les références au panel. Et au printerJob, qui garde une référence sur le panel que vous avez passée via setPrintable.

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par toutatafr Voir le message
    Je savais qu'on pouvait allouer plus de mémoire à la JVM, mais il me semble que ce n'est pas très propre (est-ce une méthode courante?) et je préfèrerais comprendre où est mon erreur.
    Ca n'a rien de "sale". Ca depend de l'utilisation. Si le nombre de jpanels est connu à l'avance, il n'y a rien de problematique a augmenter la taille memoire pour pouvoir les gerer.
    Maintenant, si les jpanels sont potentiellement illimités et temporaires, c'est sur qu'il est mieux de les liberer après usage...

    Mais sur le principe, c'est pas choquant d'augmenter la taille memoire quand on en a besoin...

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Ce qui est choquant c'est que malgré les améliorations apportées a Java 1.5, il faille encore faire cela manuellement.
    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. Réponses: 2
    Dernier message: 18/12/2007, 22h34
  2. [TTHREAD] ne termine pas sont exécution
    Par Bbenj dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2002, 16h42
  3. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  4. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

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