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 :

java.lang.IllegalStateException: Attempt to mutate in notification


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut java.lang.IllegalStateException: Attempt to mutate in notification
    salut tout le monde,

    j'ai un JPanel qui contient 17 JtextField (c'est pour un logiciel de comptablité) et le contenu de quelques JTextField dépends du contenu des autres, c'est à dire si je fais un changement dans un JtextField, le contenu d'autres va être changer, pour cette raison j'ai utilisé la classe DocumentListener, voici à peu prés le squette de mon code:

    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
    76
    public class Location extends JPanel {
    	//declaration des variables
    	public Location() {
    		//ajout des composant à mon JPanel
    		calculer();
    		AjouterEvt(Location.this);
     
    	}
     
    		public void AjouterEvt(JPanel p) {
     
    		for (Component c : p.getComponents()) {
    			if (c instanceof JPanel) {
     
    				AjouterEvt((JPanel) c);
    				// System.out.println(((JPanel) c).getWidth());
    			} else {
     
    				if (c instanceof JTextField) {
    					((JTextField) c).getDocument().addDocumentListener(
    							new Ecouteurs());
     
    				}
    			}
    		}
    	}
     
    	public void calculer() {
    		textField_2.setText("");
    		double duree = contenu(textField) * contenu(textField_1);
    		System.out.println(duree);
    		textField_2.setText("" + duree);
    		tfTva.setText("" + contenu(tfTotal2) * 0.17);
    		tf75.setText("" + contenu(tfTrav) * 3000);
    		tfTimbres.setText("" + contenu(tfPages) * 2 * 20);
    		double total1 = contenu(tfEnreg) + contenu(tfTimbres)
    				+ contenu(tfConserv) + contenu(tfTva);
    		tfTotal1.setText("" + total1);
    		double total2 = contenu(tfNotaire) + contenu(tf22) + contenu(tf78)
    				+ contenu(tf79) + contenu(tf75);
    		tfTotal2.setText("" + total2);
    		double total = total1 + total2;
    		tfTotal.setText("" + total);
    	}
     
    	public double contenu(JTextField t) {
    		double contenu;
    		if (t.getText().equals(""))
    			contenu = 0;
    		else
    			contenu = Double.parseDouble(t.getText());
    		return contenu;
    	}
     
    	class Ecouteurs implements DocumentListener {
    		@Override
    		public void changedUpdate(DocumentEvent e) {
    			calculer();
     
    		}
     
    		@Override
    		public void insertUpdate(DocumentEvent e) {
    			// TODO Auto-generated method stub
    			calculer();
     
    		}
     
    		@Override
    		public void removeUpdate(DocumentEvent e) {
    			// TODO Auto-generated method stub
    			calculer();
    		}
    	}
     
    }
    si je fais un chagement dans un de mes JTextField il m'affiche l'exception suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
    Merci d'avance

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu as un bouclage dans le traitement de tes évenements :

    • un composant 1 soulève un événement (enfin le document du composant 1)
    • ça fait un calcul qui change le composant 1


    La documentation dit bien qu'il ne faut pas le faire :
    The DocumentEvent notification is based upon the JavaBeans event model. There is no guarantee about the order of delivery to listeners, and all listeners must be notified prior to making further mutations to the Document. This means implementations of the DocumentListener may not mutate the source of the event (i.e. the associated Document).
    Par ailleurs, les évènements de document peuvent être asynchrones (lancés sur autre thread que SWING) : l'écouteur devra être thread-safe dans ce cas.

    Attention, le fait de faire un SwingUtilities.invokeLater(()-> calculer()), s'il évite l'exception, n'empêchera pas forcément le bouclage (il faut prévoir un test pour l'empêcher) et peut être très gênant pour la saisie, voire empêcher de pouvoir la faire (remplacement continuel de ce qui est saisi). Normalement, il n'y a pas de raison qu'un composant se modifie lui-même. Il peut y avoir des modifications en cascades qui génèrent la boucle. Là, il faut faire attention à ce qu'on fait, et éventuellement utiliser un booléen pour tester/empêcher le bouclage. Si c'est nécessaire de le faire, il faut que tu utilises un DocumentFilter, qui permet la modification de la saisie "à la volée".
    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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/02/2017, 16h02
  2. Réponses: 0
    Dernier message: 17/09/2009, 09h48
  3. java lang IllegalStateException
    Par jawed84 dans le forum Struts 1
    Réponses: 1
    Dernier message: 09/01/2008, 23h44
  4. java .lang. IllegalStateException
    Par zaineb.z dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/08/2007, 01h20
  5. probleme Tomcat java.lang.IllegalStateException
    Par lulululucie dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 29/12/2006, 12h53

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