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 :

Affichage JProgressBar de façon "modale"


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2006
    Messages : 111
    Par défaut Affichage JProgressBar de façon "modale"
    Bonjour à tous,

    Je cherche à afficher une JProgressBar de façon modale.

    Pour cela j'ai donc créé une classe TraitementLong héritant de JDialog et contenant ma JProgessBar. Puis je crée une instance de TraitementLong et je lance un thread à partir de celle-ci (via une méthode enregistrer() par exemple) afin de réaliser une tâche tout en affichant ma JProgressBar.

    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
     
    import java.awt.Container;
    import java.awt.GridLayout;
     
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
     
    public class TraitementLong extends JDialog {
    	private JProgressBar jBar;
    	private JLabel label;
    	private GridLayout layout;
    	private JFrame vue;
     
    	public TraitementLong(JFrame vue) {
    		this.vue = vue;
     
    		jBar = new JProgressBar();
    		label = new JLabel(BundleAcces.getIHMBundle().getString("ProgressBar.Label"));
    		layout = new GridLayout(2,1);
     
    		// Construction de la fenêtre
    		Container contentPane = getContentPane();
    		contentPane.setLayout(layout);
    		jBar.setIndeterminate(true);
    		contentPane.add(jBar);
    		contentPane.add(label);
    		setUndecorated(true);
     
    		// Affichage de la fenêtre
    		pack();
    		setLocationRelativeTo(vue);
    		setVisible(true);
    	}
     
    	public void enregistrer() {
    		ThreadEnregistrer t = new ThreadEnregistrer(vue, this);
    		t.start();
    	}
    }
    Cela fonctionne mais même si je met setAlwaysOnTop à true, l'utilisateur peut toujours faire d'autres actions qui risquent de rendre incohérente les données. Et je ne veux pas synchroniser tout pour ça, je préférerais rendre cette JProgressBar modale afin que l'utilisateur n'ait plus accès à rien en attendant la fin de la tâche.
    Cependant si je rend ma JDialog modale alors la JProgressBar ne se ferme jamais (principe de "modale").

    Savez vous comment je pourrais m'en tirer ?

    Merci d'avance à ceux qui prendront le temps de ma lire

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2006
    Messages : 111
    Par défaut
    En cherchant un peu plus sur le forum, j'ai trouvé ce post : http://www.developpez.net/forums/d56...modale-thread/

    J'ai donc appliqué la méthode et cela fonctionne.
    Je désactive la fenêtre appelante au moment de la création de TraitementLong et je la réactive à la fin du thread dans un bloc finally (afin d'être certain qu'elle soit réactivée)

    J'espère que cela en aidera certains.
    Si quelqu'un y voit un problème, qu'il n'hésite pas à m'en faire part mais pour le moment cela a l'air de fonctionner.


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

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