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

AWT/Swing Java Discussion :

Deadlock? incompréhensible JTabbedPane


Sujet :

AWT/Swing 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 Deadlock? incompréhensible JTabbedPane
    Salut,

    J'ai corrigé pas mal de deadlocks que j'avais dans mon appli (faut dire j'avais pas hésité sur les synchronized), mais là je tombe sur un problème très étrange... Ca ressemble à un deadlock, le programme plante et se fige, mais, comment est-ce possible?

    Voici un code d'une méthode d'une classe héritant de JTabbedPane:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void method(Component component) {
        System.out.println("edt : " + SwingUtilities.isEventDispatchThread());
        add(component);
        System.out.println("added");
    }
    Le résultat est:
    Et c'est figé...

    Comment la méthode add(component) peut-être créer un deadlock à elle toute seule?

    Vous avez une idée?

    PS: ça ne le fait que dans un contexte très particulier, mais je ne vois pas comment c'est possible que add(component) bloque quoi que ce soit...

  2. #2
    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
    Bon, apparemment ça vient du composant que j'ajoute... Si j'ajoute un new JPanel() ça marche...
    Par contre, je ne vois tjs pas pk...

  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
    EDIT: J'ai enfin trouvé...

    Dans une classe (celle du composant), j'avais une méthode synchronized (c'était la seule synchronized de la classe, donc je l'ai mis devant la méthode).
    Mais en fait, en faisant synchronized(unAutreObjet) { ... } ça marche... Je suppose que c'est parce que dans JPanel (mon composant), il y a déjà des méthodes synchronized ;-)
    Enfin, voilà je viens de perdre 1h30...

    Bonne nuit

  4. #4
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Je trouve cela étrange que tu utilises autant de synchronized. Si tu utilises Java 5, va plutôt voir du côté du package java.util.concurrent et demande-toi si tous tes synchronize sont nécessaires (après tout, ce sont des composants, manipulés par 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
    C'est par exemple pour les listeners:
    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
    public void addXListener(XListener listener) {
        synchronized(xListeners) {
            listeners.add(listener);
        }
    }
     
    public void removeXListener(XListener listener) {
        synchronized(xListeners) {
            listeners.remove(listener);
        }
    }
     
    public void fireXAction() {
        XEvent event = new XEvent(...);
     
        Collection<XListener> listeners;
        synchronized(xListeners) {
            /* On copie la liste des écouteurs, car elle peut être modifiée dans l'appel à la méthode de l'interface, par exemple xAction(event) peut exécuter un addXListener(...). */
            listeners = new ArrayList<XListener>(xListeners);
        }
     
        for(XListener listener : listeners)
            listener.xAction(event);
    }
    Qu'en penses-tu? C'est trop "sécurisé"?

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Oui Utilise-tu ces méthodes ailleurs que dans l'EDT ? En outre il existe une classe spécialisée dans la gestion des listes de listeners : javax.swing.event.EventListenerList

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

Discussions similaires

  1. [JTabbedPane] afficher texte étiquette bas en haut.
    Par spoutyoyo dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 07/07/2009, 17h46
  2. [JTabbedPane] Accès à des composants dynamiques
    Par SamRay1024 dans le forum Composants
    Réponses: 8
    Dernier message: 26/05/2004, 13h04
  3. incompréhension avec ado
    Par Orgied dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2004, 18h24
  4. [WSAD5] probleme incompréhensible
    Par capitaine_banane dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 07/04/2004, 11h56
  5. [JSP] Erreur incompréhensible
    Par xxaragornxx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/09/2003, 16h37

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