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

Interfaces Graphiques en Java Discussion :

Affichage de JFileChoser ou de dialogue d'impression long


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut Affichage de JFileChoser ou de dialogue d'impression long
    Bonjour,

    Dans une application fenêtrée j'utilise un JFileChoser pour ouvrir/enregistrer des fichiers, et la méthode PrintJob.printDialog() pour lancer une boite de dialogue pour impression.

    Tout marche correctement, cependant entre le moment ou l'utilisateur clic sur "Ouvrir" et le moment ou l'explorateur s'affiche est long; cela est encore plus fort quand l'utilisateur demande une impression et la boite arrive (environ 5 secondes!) et je ne voudrais pas que l'utilisateur pense que l'application ai planté.

    J'ai remarqué aussi que si je lance deux fois le dialogue d'impression, la seconde fois le traitement est nettement plus rapide.

    Comment remédier à ce problème ?
    Peut-on pré charger ces ordres ?

    Merci pour vos solutions.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Bonjour,

    je ne sais pas trop pourquoi ca prend du temps, mais par contre pour éviter que l'utilisateur pense que l'appli a planté, tu peux montrer que ton appli réfléchit, avec un curseur particulier(le sablier par ex) ou avec une barre de défilement.

    Cdlt

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Sinon tu peux essayer d'instancier un JFileChooser au démarrage de ton appli histoire de voir ce que çà donne

  4. #4
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut
    Bonjour,
    Le JFileChooser avant la sortie de l'update java 1.6.0_04 est effectivement long (sous Windows), c'est du à un bug.

    Le problème a été réglé depuis, donc je t'invite à télécharger la nouvelle version de java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Citation Envoyé par bassim Voir le message
    Bonjour,
    Le JFileChooser avant la sortie de l'update java 1.6.0_04 est effectivement long (sous Windows), c'est du à un bug.

    Le problème a été réglé depuis, donc je t'invite à télécharger la nouvelle version de java
    Mais bon, si quelqu'un utilise mon application, le temps de chargement dépendra toujours de sa version de Java non ?

    Citation Envoyé par piou1234 Voir le message
    je ne sais pas trop pourquoi ca prend du temps, mais par contre pour éviter que l'utilisateur pense que l'appli a planté, tu peux montrer que ton appli réfléchit, avec un curseur particulier(le sablier par ex) ou avec une barre de défilement.
    Merci pour l'astuce, je n'y avais pas pensé et ça marche bien !
    Bien que ca ne résouds pas le problème ^^
    Au passage j'ai un soucis avec NetBeans, car quand je met setCursor( Cursor.WAIT ) il me dit que setCursor(int) est deprecated, or je ne voie pas comment écrire pour utiliser setCursor(Cursor)...!


    J'ai remarqué que l'impression d'une seule fiche de personnel occasionne un temps de "chargement" plus long que l'impression de toutes les fiches ensemble, peut être que j'ai mal codé ma méthode.
    Voici ma classe FichePersonnel:
    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
    /**
     * 
     * Cette classe est un document papier destiné à être imprimé.
     * 
     */
     
    package document;
     
     
    import personnel.*;
     
    import java.awt.*;
    import java.awt.print.*;
    import javax.swing.*;
     
    import java.text.NumberFormat;
     
     
    public class FichePersonnel extends JPanel implements Printable {
     
     
        // Personnel concerné par la fiche
    	private Personnel pers;
     
     
    	// Pour impression de toutes les fiches
        private int pIndex;
     
     
    	// Constructeurs
    	public FichePersonnel(Personnel pers) {
     
            this.pIndex = 0;
    		this.pers = pers;
    	}
     
        public FichePersonnel(Personnel pers, int pIndex) {
     
            this.pIndex = pIndex;
    		this.pers = pers;
    	}
     
     
     
    	// Dessine la/les pages ? imprimer
    	public int print(Graphics g, PageFormat pFormat, int pIndex) {
     
            // Le document est sur une page unique
    		if(pIndex != this.pIndex)
    			return NO_SUCH_PAGE;
     
     
    		/* Ici tous les dessins via Graphics */
     
     
            // On envoie la page
    		return PAGE_EXISTS;
    	}
     
     
     
    	// Lance la boite de dialogue pour impression
    	// Retourne true si l'impression à été lancée, false sinon
    	public boolean dialogueImpression() {
     
    		PrinterJob printJob = PrinterJob.getPrinterJob();
     
    		PageFormat pFormat = printJob.defaultPage();
     
    		printJob.setPrintable(this, pFormat);
     
    		if( printJob.printDialog() ){
     
    			try {
    				printJob.print();
    				return true;
    			}
    			catch(PrinterException ex) {
    				JOptionPane.showMessageDialog(this, ex);
    				return false;
    			}
     
    		} else
    			return false;
    	}
     
    }
    Et maintenant mes appels pour imprimer une fiche, ou alors toutes:
    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
     
     
        // Imprimer le personnel courant
        private void mItemImprimerActionPerformed(java.awt.event.ActionEvent evt) {                                              
     
            Personnel pers = <OBTENIR DANS MON CONTENEUR>
     
            FichePersonnel fPers = new FichePersonnel(pers);
     
            setCursor( Cursor.WAIT_CURSOR );
     
            if( fPers.dialogueImpression() )
                labBasFenetre.setText("Impression de la fiche du personnel envoyé.");
     
            setCursor( Cursor.DEFAULT_CURSOR );
        }                                             
     
     
     
        // Imprime tout le personel du conteneur
        private void mItemImprimerToutActionPerformed(java.awt.event.ActionEvent evt) {                                                  
     
            PrinterJob printJob = PrinterJob.getPrinterJob();
    		PageFormat pFormat = printJob.defaultPage();
     
            Book fiches = new Book();
     
     
            // On parcours le conteneur et on ajoute toutes les fiches au Book
            for( <PARCOURS DU CONTENEUR> ) {
                fichePers = new FichePersonnel( <OBTENIR SUIVANT> , pageIndex++);
                fiches.append( fichePers , pFormat );
            }
            printJob.setPageable(fiches);
     
     
            // On ouvre le dialogue d'impression
            setCursor( Cursor.WAIT_CURSOR );
     
            if( printJob.printDialog() ){
    		try {
    			printJob.print();
                labBasFenetre.setText("Impression de toutes les fiches du personnel envoyé.");
    		}
    		catch(PrinterException ex) {
    			JOptionPane.showMessageDialog(this, ex);
    		}
    	} 
     
            setCursor( Cursor.DEFAULT_CURSOR );
        }
    Vous voyez quelque chose de travers ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Par défaut
    Je m'étais déjà confronté à ce bug qui n'était pas corrigé à l'époque, j'avais été obligé d'utiliser un java.awt.FileDialog au lieu du JFileChooser.
    Mais apparemment le bug serait corrigé (je viens de l'apprendre, merci bassim !), donc soit tu change de version de java, soit tu peux pas et tu utilises un FileDialog

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Par défaut
    Bon je me suis fait grillé...
    Pour les curseurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

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

Discussions similaires

  1. affichage dans la boite de dialogue
    Par chloep dans le forum Langage
    Réponses: 3
    Dernier message: 09/01/2007, 10h08
  2. Réponses: 6
    Dernier message: 14/06/2006, 08h56
  3. Réponses: 1
    Dernier message: 08/12/2005, 10h14
  4. Réponses: 2
    Dernier message: 01/05/2004, 12h19
  5. Affichage d'une boite de dialogue nonmodale avec MFC
    Par the.cable.guy dans le forum Windows
    Réponses: 3
    Dernier message: 04/07/2003, 17h59

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