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

Agents de placement/Fenêtres Java Discussion :

Probleme d'affichage JDialog et JProgressBar


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut Probleme d'affichage JDialog et JProgressBar
    Bonjour à tous,

    j'ai un petit soucis avec l'affichage de ma boite de dialogue (plus particulièrement du contenu de celle-ci).

    j'ai créé une JFrame avec un bouton, une boite de dialogue contenant une barre de progression doit s'afficher lorsque l'app est lancé.

    jusque là tout va bien , ça marche impeccable.

    cette boite dialogue doit aussi s'ouvrir lorsque l'on appuie sur le bouton de la JFrame, et là c'est le drame, la boite de dialogue s'affiche mais pas son contenu, pourtant la tache qui doit s’exécuter pendant l'affichage se déroule bien.

    Pourriez-vous regarder mon code et me dire ce que j'ai mal fais ?

    Tous les commentaires, critiques, félicitations ou autres applaudissement seront bien évidement acceptés.

    Je précise que je me suis basé sur le code trouvé à cette adresse : http://java2s.com

    En remerciant par avance tous ceux qui voudront bien m'aider.

    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
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class Main {
    	static JFrame parentFrame;
    	public static void main(String[] args) {
     
    		parentFrame = new JFrame();
    		parentFrame.setLayout(null);
    		parentFrame.setSize(500, 150);
    		parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		parentFrame.setVisible(true);
    		parentFrame.setLocationRelativeTo(null);
    		JButton btnNewButton = new JButton("Bouton");
    		parentFrame.add(btnNewButton);
    		btnNewButton.addMouseListener(new MouseAdapter() {
    			public void mouseClicked(MouseEvent e) {
    				maj();
    			}
    		});
    		btnNewButton.setBounds(10, 11, 89, 23);
     
    		maj();
    	}
    	private static void maj(){
     
    		BarProg dlg = new BarProg(parentFrame);
    		BarProg.lcmt(dlg);
     
    	}
    }
    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
    import java.awt.BorderLayout;
     
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
     
    public class BarProg extends JDialog {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	static JProgressBar dpb;
    	public BarProg(JFrame parentFrame){
    		super(parentFrame," ",true);
    		dpb = new JProgressBar(0, 500);
    		dpb.setIndeterminate(true);
    		this.add(BorderLayout.CENTER, dpb);
    		this.add(BorderLayout.NORTH, new JLabel("Progress..."));
    		this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    		this.setSize(300, 75);
    		this.setLocationRelativeTo(parentFrame);
     
    	}
     
    	static void lcmt(final BarProg barProg){
    		barProg.repaint();
    		Thread t = new Thread(new Runnable() {
    			public void run() {
    				barProg.setVisible(true);
    			}
    		});
    		t.start();
    		for (int i = 0; i <= 500; i++) {
    			dpb.setValue(i);
    			if(dpb.getValue() == 500){
    				barProg.setVisible(false);
    			}
    			try {
    				Thread.sleep(10);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les évènements SWING s'exécutent dans l'EDT (Event Dispatcher Thread), qui se trouve être également le thread utilisé par SWING pour mettre à jour l'affichage.

    Quand la méthode maj() est appelée dans le thread principal (le thread par défaut utilisé par ton programme, qui n'est pas l'EDT), elle appelle Lcmt dans ce même thread, et la boucle for est exécutée donc dans ce thread, ainsi que la fermeture du dialog à la fin. Et tout fonctionne comme attendu.

    Quand tu lances la méthode maj() depuis l'événément mouseClicked() (au passage, on utilise plutôt un actionListener pour agir sur l'action d'un bouton), la méthode maj() est appelée donc dans l'EDT, et Lcmt() également, et, donc, la boucle s'exécute dans l'EDT : aucun affichage ne pouvant être rafraichi tant que le code n'est pas terminée (tant que l'EDT est occupé), donc tant que la boucle n'est pas terminée, mais en plus après qu'on ait fermé le dialogue. Donc tu ne vois jamais ta barre de progression.

    C'est typiquement le genre d'exemple un peu bidon, sans explication, qui, sorti de son contexte (inexistant), n'est pas utilisable (ou du moins n'est pas efficace pour apprendre). La façon dont tu l'as modifiée le montre : la boucle ne sert à rien dans ce cas (dans l'exemple d'origine elle sert à mettre à jour le label qui affiche le compteur, et la progressbar qui n'est pas "inderminée").

    Modifie ta classe BarProg comme ça, au moins :
    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
    public class BarProg extends JDialog {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	static JProgressBar dpb;
    	public BarProg(JFrame parentFrame){
    		super(parentFrame," ",true);
    		dpb = new JProgressBar(0, 500);
    		dpb.setIndeterminate(true);
    		this.add(BorderLayout.CENTER, dpb);
    		this.add(BorderLayout.NORTH, new JLabel("Progress..."));
    		this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    		this.setSize(300, 75);
    		this.setLocationRelativeTo(parentFrame);
     
    	}
     
    	static void lcmt(final BarProg barProg){
    		Thread t = new Thread(new Runnable() {
    			public void run() {
    				try {
    					Thread.sleep(5000);
    				} catch (InterruptedException e) { 
    				}
    				barProg.setVisible(false); // on ferme (on cache) le dialogue
    				barProg.dispose(); // si on ne sert plus du dialogue, autant libérer les ressources associées
    			}
    		});
    		t.start(); // lance le thread qui attend 5 s avant de refermer le dialogue
    		barProg.setVisible(true); // on affiche le dialogue (comme il est modale, ça bloque le thread courant)
    	}
    }
    En fait, pour être plus clean, il faudrait faire, au moins (parce qu'on pourrait encore utiliser un SwingWorker, et peut être même tester si on lance la méthode depuis l'EDT ou pas) :

    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
    package project;
    import java.awt.BorderLayout;
     
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
     
    public class BarProg extends JDialog {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	static JProgressBar dpb;
    	public BarProg(JFrame parentFrame){
    		super(parentFrame," ",true);
    		dpb = new JProgressBar(0, 500);
    		dpb.setIndeterminate(true);
    		this.add(BorderLayout.CENTER, dpb);
    		this.add(BorderLayout.NORTH, new JLabel("Progress..."));
    		this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    		this.setSize(300, 75);
    		this.setLocationRelativeTo(parentFrame);
     
    	}
     
    	static void lcmt(final BarProg barProg){
    		Thread t = new Thread(new Runnable() {
    			public void run() {
                                    // on force l'appel sur l'EDT, sans que le thread courant ne soit bloqué (le setVisible(true) va bloquer l'appel, puisque le dialogue est modal)
    				SwingUtilities.invokeLater(new Runnable() {
     
    					@Override
    					public void run() {
    						barProg.setVisible(true); // on affiche le dialogue (comme il est modale, ça bloque le thread courant)
    					}
     
    				});
                                    // la boucle d'attente est faite en dehors de l'EDT pour ne pas bloquer l'affichage (et éventuellement d'autres composants SWING dont on voudrait pouvoir se servir pendant la progression)
    				try {
    					Thread.sleep(5000);
    				} catch (InterruptedException e) { 
    				}
                                    // on ferme le dialogue sur l'EDT, ce qui garanti qu'il soit bien fermé après avoir été ouvert (enfin normalement ça devrait être le cas, même si on l'exécutait dans le thread courant, puisqu'il y a peu de risque que SWING rame pendant 5 secondes avant d'afficher le dialogue, mais on ne sait jamais)
    				SwingUtilities.invokeLater(new Runnable() {
     
    					@Override
    					public void run() {
    						barProg.setVisible(false); // on ferme (on cache) le dialogue
    						barProg.dispose(); // si on ne sert plus du dialogue, autant libérer les ressources associées
    					}
     
    				});
    			}
    		});
    		t.start(); // lance le thread, qui affiche le dialogue, qui attend 5 s avant de refermer le dialogue
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    j'étais justement sur la piste du swing.utilities,
    j’étais un peu perdu entre les invokeLater et les invokeAndWait.

    Je vais désormais me pencher sur le swingworker qui semblerait etre une manière plus "propre" de travailler.

    Un gros merci pour le temps que tu m'as consacré et pour ton aide.

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

Discussions similaires

  1. probleme d'affichage d'un JDialog
    Par riadhhwajdii dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 14/10/2009, 16h19
  2. [VB.NET] Probleme d'affichage de controle
    Par mic56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/06/2004, 15h03
  3. xml-xsl-fo : probleme d'affichage d'un tableau
    Par clindoeil dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 12/12/2003, 12h46
  4. [langage] Problème d'affichage
    Par marcoss dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2003, 13h05
  5. IE [Applet] Plug-in problème d'affichage
    Par Tonton Luc dans le forum JBuilder
    Réponses: 4
    Dernier message: 19/06/2003, 08h28

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