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 :

Problème avec JDialog appelant JWindow


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut Problème avec JDialog appelant JWindow
    Bonjour a tous,

    Je suis confronté à un problème que je ne comprends pas trop.

    Ce que j'essaie de faire me parait simple mais apparemment c'est trop compliqué pour moi !
    J'appelle une JDialog qui fait une requete http et qui s'affiche une fois la réponse reçu.
    En attendant la réponse j'aimerais afficher une JWindow avec un gif d'attente qui montre que l'appli travaille.
    Problème : ma JWindow appellé par ma JDialog ne s'affiche qu'une fois que cette dernière est affichée et donc trop tard...
    J'aimerais donc que ma JWindow n'attende pas l'affichage de la JDialog pour s'afficher elle même.
    A la base je ne voulais pas m'encombrer avec la création d'un thread. Je suppose que ca réglerait le problème mais je ne comprends pas trop pourquoi la JWindow attend la JDialog ????

    Voila mon code simplifié (avec un sleep a la place de ma requete HTTP) :

    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
     
    public class TestDialog extends JDialog {
     
        public TestDialog(Window arg0, String arg1) {
    	super(arg0, arg1);
    	this.setSize(new Dimension(200, 200));
    	this.setLocationRelativeTo(null);
    	JWindow tWnd = new JWindow(arg0);
    	tWnd.setSize(70, 70);
    	tWnd.getContentPane().setBackground(Color.BLACK);
    	JPanel imagePanel = new JPanel();
    	ImageIcon image = new ImageIcon(getClass().getResource("/load.gif"));
    	JLabel imageLabel = new JLabel(image);
    	imageLabel.setSize(48,48);
    	imagePanel.add(imageLabel);
    	tWnd.getContentPane().add(imagePanel,BorderLayout.CENTER);
    	tWnd.setLocationRelativeTo(null);
    	tWnd.setVisible(true);
    	try {
    	    Thread.sleep(4000);
    	} catch (InterruptedException e) {
    	    // TODO Auto-generated catch block
    	    e.printStackTrace();
    	}
         //	tWnd.dispose();
    	this.setVisible(true);
        }
    }
    Merci pour votre aide.

  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 : 56
    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,

    L'affichage étant géré dans un et un seul thread, afficher 2 fenêtres (dialogues ou pas) ne peut se faire que successivement. Un dialogue étant en général modal, donc bloquant, si on veut afficher une autre fenêtre "en même temp", il faudra l'afficher avant le dialogue (et la fermer à la fermeture du dialogue).

    Pour afficher ton Gif animé dans un dialogue non modal : Créer un ImageIcon, le mettre dans un JLabel et mettre le JLabel dans le dialogue...


    EDIT : je viens de remarquer dans ton code que tu faisais la requête dans le même thread qui affichent tes dialogues. Attention à ce que ce thread ne soit pas le thread graphique : si tu bloques l'affichage, tu ne verras pas d'évolution de celui-ci pendant le temps ou du bloque le thread (thread bloqué = pas de code qui s'exécute). Pour ce genre de traitement, parallélise en utilisant un thread ou un SwingWorker par exemple.

    Voici un petit snippet d'exemple d'affichage de jdialog avec gif animé d'attente et message affiché à la fin : j'ai utilisé un thread ici pour aller plus vite pour l'exemple.

    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
    public class JDialogGifAn {
     
    	public void run() throws IOException {
     
    		JDialog dialog = premierDialog();
     
    		process(dialog);
     
    	}
     
    	private void process(final JDialog dialog) {
     
    		new Thread() {
     
    			public void run() {
     
    				// simulation de la requête
    				try {
    					Thread.sleep(4000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    				SwingUtilities.invokeLater(new Runnable() {
     
    					@Override
    					public void run() {
    						dialog.setVisible(false);
    						dialog.dispose();
    						JOptionPane.showMessageDialog(null, "Résultat obtenu...");
    					}
    				});
     
     
    			}
     
    		}.start();
     
     
     
    	}
     
    	private JDialog premierDialog() {
     
    		ImageIcon gifan = new ImageIcon("c:/temp/gears.gif");
     
    		JPanel jpanel = new JPanel();
    		jpanel.add(new JLabel(gifan));
    		jpanel.add(new JLabel("Calcul en cours..."));
     
    		JDialog jdialog = new JDialog();
    		jdialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
     
    		jdialog.setModal(false);
     
    		jdialog.add(jpanel);
    		jdialog.pack();
    		jdialog.setLocationRelativeTo(null);
    		jdialog.setVisible(true);
     
    		return jdialog;
     
    	}
     
    	public static void main(String[] args) {
    		try {
    			new JDialogGifAn().run();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
     
    }
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut
    Ok. Merci.
    C'est à peu près ce que je pensais mais c'est plus clair maintenant.
    J'avais pas vraiment saisi les conséquence de faire requête + affichage dans le même thread.
    En effet pour m'en sortir j'ai créé une classe dérivant de JDialog implémentant runnable

    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
    public class TestDialog extends JDialog {
     
        public TestDialog(Window arg0, String arg1) {
    	super(arg0, arg1);
    	this.setSize(new Dimension(200, 200));
    	this.setLocationRelativeTo(null);
    	WindowTest tWnd = new WindowTest(this);
    	Thread t = new Thread(tWnd);
    	t.start();
    	this.setVisible(true);
        }
    }
     
    public class WindowTest extends JWindow implements Runnable{
     
        public WindowTest(JDialog arg0){
    	super(arg0);
    	setSize(200, 200);
    	getContentPane().setBackground(Color.BLACK);
    	JPanel imagePanel = new JPanel();
    	ImageIcon image = new ImageIcon(getClass().getResource("/load.gif"));
    	JLabel imageLabel = new JLabel(image);
    	imageLabel.setSize(200,200);
    	imagePanel.add(imageLabel);
    	getContentPane().add(imagePanel,BorderLayout.CENTER);
    	setLocationRelativeTo(null);
    	setVisible(true);
        }
        @Override
        public void run() {
    	//simulation requete
    	try {
    	    Thread.sleep(4000);
    	} catch (InterruptedException e) {
    	    // TODO Auto-generated catch block
    	    e.printStackTrace();
    	}
    	this.dispose();
     
        }

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

Discussions similaires

  1. [débutant]2 petits problèmes avec JDialog
    Par pingoui dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 18/02/2007, 19h46
  2. problème avec un appel de fonction de callback de C++ vers C#
    Par surfurax dans le forum Framework .NET
    Réponses: 1
    Dernier message: 29/01/2007, 10h09
  3. [NASM] Problème avec l'appel des interruptions
    Par homeostasie dans le forum Assembleur
    Réponses: 3
    Dernier message: 23/01/2007, 16h50
  4. [Débutante] problème avec JDialog
    Par maya dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 02/12/2006, 04h44
  5. problème avec l'appel d'une fonction
    Par mademoizel dans le forum ASP
    Réponses: 5
    Dernier message: 26/06/2006, 15h04

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