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 :

JDialog : fonctionnement?


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut JDialog : fonctionnement?
    Salut,

    Je ne comprends pas le fonctionnement de JDialog vis-à-vis de l'EDT.
    En effet, si dans un actionPerformed (lors du clic sur un bouton) on crée un JDialog modal, les instructions après ce jdialog ne seront exécutées que lorsque le jdialog sera fermé.
    Donc, en théorie, l'EDT est bloqué.
    Comment ça se fait que justement, il n'est pas bloqué et que tout fonctionne?

    Un petit exemple (le code est pas très lisible, mais c t pour faire le moins de lignes possible) :
    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
    public class TestJDialog {
     
        public static void main(String... args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    final JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setBounds(100, 100, 200, 100);
                    JButton but = new JButton("Clic");
                    frame.getContentPane().add(but);
                    but.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            System.out.println("avant le dialog");
                            JDialog dial = new JDialog(frame, true);
                            dial.setBounds(50, 50, 50, 50);
                            dial.setVisible(true);
                            System.out.println("après le dialog");
                        }
                    });
                    frame.setVisible(true);
                }
            });
     
        }
     
    }
    "après le dialog" est affiché uniquement une fois qu'on a fermé le JDialog...

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    La boucle principale de traitement des événements présente dans l'EDT (méthode pumpEvents) est "recopiée" en fin de la méthode Dialog.show() (appel de la méthode pumpEventsForHierarchy) : cette dernière boucle se termine dès que le dialogue modal est fermée, pour redonner la main à la boucle principale.

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par herve91
    La boucle principale de traitement des événements présente dans l'EDT (méthode pumpEvents) est "recopiée" en fin de la méthode Dialog.show() (appel de la méthode pumpEventsForHierarchy) : cette dernière boucle se termine dès que le dialogue modal est fermée, pour redonner la main à la boucle principale.
    J'ai regardé un peu les sources de Dialog et de EventDispatchThread, mais là j'avoue avoir du mal à comprendre.
    Comment ça "est recopiée"? Et comment est assurée l'unicité d'accès (pas plusieurs threads modifiant l'interface graphique?

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    "recopiée" est un abus de langage... je veux dire qu'il y a une boucle dans l'EDT et une seconde boucle dans la méthode show() de Dialog, qui prend la main lorsque le dialogue (modal) est rendue visible, et qui rend la main lorsqu'elle devient invisible.
    Unicité d'accès ? Il ne peut y avoir plusieurs threads modifiant l'interface graphique, celles-ci devant avoir lieu au sein de l'EDT. Les deux boucles mentionnées précédemment s'exécutent toutes deux au sein de l'EDT.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par herve91
    "recopiée" est un abus de langage... je veux dire qu'il y a une boucle dans l'EDT et une seconde boucle dans la méthode show() de Dialog, qui prend la main lorsque le dialogue (modal) est rendue visible, et qui rend la main lorsqu'elle devient invisible.
    Unicité d'accès ? Il ne peut y avoir plusieurs threads modifiant l'interface graphique, celles-ci devant avoir lieu au sein de l'EDT. Les deux boucles mentionnées précédemment s'exécutent toutes deux au sein de l'EDT.
    Donc si j'ai bien compris, tout ce que tu mets en file de l'eventqueue (avec SwingUtilities.invokeLater(Runnable)) n'est pas forcément "mangé" par l'EDT lui-même, mais peut être mangé par la boucle exécutée dans show() de jdialog modal?

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Attention, l'EDT est un thread ! c'est bien l'EDT qui mange ce que tu mets en file de l'event queue, sauf que le code qui consomme n'est pas la boucle de la méthode run() de la classe EventDispatchThread, mais la boucle de la méthode show() de Dialog.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  2. Récuperer les icons des JDialog
    Par Pro_Fete dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 17/04/2003, 13h00
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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