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

Concurrence et multi-thread Java Discussion :

Erreur "Exception in thread, setSelected(true)"


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Par défaut Erreur "Exception in thread, setSelected(true)"
    Bonjour,
    je travaille actuellement sur une application java graphique.
    En effectuant des tests avec JUnit, j'ai remarqué que celle-ci lève une exception dans à peut près 1/4 des lancements de l'application .

    L'exception se lève lors d'un setSelected(true) sur un JRadioButtonMenuItem :
    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
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at javax.swing.plaf.basic.BasicTabbedPaneUI.rotateInsets(Unknown Source)
    	at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabAreaInsets(Unknown Source)
    	at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.calculateSize(Unknown Source)
    	at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.minimumLayoutSize(Unknown Source)
    	at java.awt.Container.minimumSize(Unknown Source)
    	at java.awt.Container.getMinimumSize(Unknown Source)
    	at javax.swing.JComponent.getMinimumSize(Unknown Source)
    	at javax.swing.GroupLayout$ComponentSpring.calculateNonlinkedMinimumSize(Unknown Source)
    	at javax.swing.GroupLayout$ComponentSpring.calculateMinimumSize(Unknown Source)
    	at javax.swing.GroupLayout$Spring.getMinimumSize(Unknown Source)
    	at javax.swing.GroupLayout$ComponentSpring.calculatePreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$Spring.getPreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.getSpringSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.calculateSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.calculatePreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$Spring.getPreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.getSpringSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.calculateSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.calculatePreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$Spring.getPreferredSize(Unknown Source)
    	at javax.swing.GroupLayout$SequentialGroup.setValidSize(Unknown Source)
    	at javax.swing.GroupLayout$Group.setSize(Unknown Source)
    	at javax.swing.GroupLayout.layoutContainer(Unknown Source)
    	at java.awt.Container.layout(Unknown Source)
    	at java.awt.Container.doLayout(Unknown Source)
    	at java.awt.Container.validateTree(Unknown Source)
    	at java.awt.Container.validateTree(Unknown Source)
    	at java.awt.Container.validateTree(Unknown Source)
    	at java.awt.Container.validateTree(Unknown Source)
    	at java.awt.Container.validate(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Le levage de l'exception provoque un dé-centrage de la fenêtre.
    Aucune information explicite n'est donnée dans le stack-trace.
    Avez-vous déjà rencontré cette situation ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a de forte chance que cela viennent du fait que tu manipules des composants graphiques en dehors de l'EDT. Est-ce que tu respectes bien cela ?


    Comment est fait ton setSelected(true) ? ET où ?


    a++

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Par défaut
    Salut adiGuba,

    Il y a de forte chance que cela viennent du fait que tu manipules des composants graphiques en dehors de l'EDT
    quand tu parle de l'EDT, tu veut dire quoi exactement ?

    Je ne sais pas si cela fera avancer le shmilblic, mais je vais résumer mon code.

    1 -> Mon Main Instancie le controlleur.

    2 -> Constructeur du controlleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Controlleur() {
    	setModele( 	new Modele(this));
    	setVue( 	new Vue(this));
    	// Charge les préférences pour la vue
    	loadPreference();
            ...		
    }
    3 -> Instanciation du Modele ...
    4 -> Instanciation de la Vue (chargement de tous les composants ...)

    5 -> Controlleur.loadPreference()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void loadPreference() {
    	// Récupération des préférences sur les checkbox
    	boolean[] bool = loadCheckBox();
    	// Récupération du mode (Liste - Template)
    	boolean mode = (getConfig().getString("mode").compareTo("0") == 0) ? true : false;
    	// Récupération du type de connexion (ssh - telnet)
    	boolean type = (getConfig().getString("typeConnexion").compareTo("ssh") == 0) ? true : false;
     
     
    	// Passage des préférences en paramètre à la vue
    	getVue().loadPreference(bool, mode, type);
    	...
    }

    6 -> Vue.loadPreference()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void loadPreference(boolean[] boolCheckBox, boolean mode, boolean type) {
    	...
            // mode1 et mode2 sont des JRadioButtonMenuItem, attributs de la vue
    	if (mode) {
                    System.out.println("Avant Mode 1");
    		mode1.setSelected(true); // Arrivé ici, le stackTrace s'affiche
                    System.out.println("Après Mode 1");
    	} else {
    		mode2.setSelected(true);
    	}
    	...
    }
    Ce qui est bizarre c'est que cela n'arrive à peut près qu'à un lancement sur 4 de l'application

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zeroc00l Voir le message
    quand tu parle de l'EDT, tu veut dire quoi exactement ?
    EDT : Event Dispatch Thread

    C'est le thread chargé de gérer l'affichage des composants AWT/Swing.
    Toute modification de l'interface utilisateur doit être opéré dans ce thread sous peine d'erreur diverses et incompréhensibles (un peu comme la tienne).


    La difficulté c'est que dans le même temps il ne faut pas surcharger ce thread avec des traitements lours sous peine de gêner l'affichage et de bloquer toute l'interface graphique...



    Donc il faut savoir dans quel thread tu es lorsque tu fais le setSelected(). Pour savoir si tu es dans l'EDT tu peux utiliser SwingUtilities.isEventDispatchThread() ou même Thread.currentThread().getName().


    En général on est dans l'EDT dans les méthodes déclenchées par les évènements, ou si on l'appel explicitement via SwingUtilities.invokeLater() ou un SwingWorker...


    Ensuite tu trouveras tout plein d'info là dessus sur le forum et le site...


    a++

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Par défaut
    Je te remercie de ta réponse, je verrai sa demain quand je disposerai des sources .

    Mais, oui il y a un mais, le soucis c'est que dans le post d'avant j'ai rétréci le code, mai voilà la méthode complète :
    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
    public void loadPreference(boolean[] boolCheckBox, boolean mode, boolean type) {
    	tracePanel.getOkCheckBox().setSelected(boolCheckBox[0]);
    	tracePanel.getNokCheckBox().setSelected(boolCheckBox[1]);
    	tracePanel.getLogCheckBox().setSelected(boolCheckBox[2]);
    	tracePanel.getEchoCheckBox().setSelected(boolCheckBox[3]);
     
    	if (mode) {
    		mode1.setSelected(true);
    	} else {
    		mode2.setSelected(true);
    	}
     
            // ssh et telnet sont aussi des JRadioButtonMenuItem
    	if (type) {
    		ssh.setSelected(true);
    	} else {
    		telnet.setSelected(true);
    	}
    }
    Et à l'exécution, on passe bien par ssh.setSelected(true) ou telnet.setSelected(true) suivant la valeur de bool, et dans ce cas, aucune exception n'est levée.

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zeroc00l Voir le message
    Et à l'exécution, on passe bien par ssh.setSelected(true) ou telnet.setSelected(true) suivant la valeur de bool, et dans ce cas, aucune exception n'est levée.
    Cela ne veut rien dire !!! Le fait de manipuler des composants graphiques en dehors de l'EDT peut engendre des erreurs totalement aléatoires et imprévisible... comme cela peut ne rien faire du tout !

    L'important étant de savoir dans quel thread tu es.


    a++

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En général on est dans l'EDT dans les méthodes déclenchées par les évènements, ou si on l'appel explicitement via SwingUtilities.invokeLater() ou un SwingWorker...

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Par défaut
    Ha ok, je n'avais pas compris. Effectivement, maintenant il n'y a plus aucune erreur, merci bien .
    Pas sur d'avoir le temps de tout reprendre avant de devoir rendre l'application.
    Pour le coup, j'ai surrounder la méthode Controlleur.loadPreference(), je sais que ce n'est pas la meilleure solution, mais le temps est compté .
    Est-ce que cela pourrait engendrer d'autre erreurs dans ce genre ?
    A l'instant même aucune erreur n'apparait durant toute l'exécution de l'application.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/07/2010, 14h38
  2. Réponses: 3
    Dernier message: 25/06/2010, 11h04
  3. [TOMCAT] Erreur Tomcat "Exception in thread"
    Par relivio dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 16/11/2009, 17h17

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