Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 12h11   #1
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
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 : 22
Points : 19
Points : 19
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 :
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.
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 15h59   #2
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

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

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
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++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 16h30   #3
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
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 : 22
Points : 19
Points : 19
Salut adiGuba,

Citation:
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 :
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 :
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 :
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
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 17h34   #4
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

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

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
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++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 22h53   #5
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
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 : 22
Points : 19
Points : 19
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 :
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.
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 09h29   #6
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

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

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
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++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h26   #7
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
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 : 22
Points : 19
Points : 19
Je viens de tester, et effectivement, je suis dans le thread principal (logique je pense puisque c'est au démarrage de l'application que je fait ces changements).
Sauriez vous comment je pourrait y remédier ?
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h30   #8
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

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

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
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...
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2012, 11h21   #9
Futur Membre du Club
 
Homme
Étudiant
Inscription : mai 2011
Messages : 22
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 : 22
Points : 19
Points : 19
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.
zeroc00l est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h05.


 
 
 
 
Partenaires

Hébergement Web