Attempt to mutate in notification

Signaler
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
Messages postés
1
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
26 mars 2012
-
Bonjour à tous.
J'ai un JTextPane. lorsque j'essaye d'affecter à une partie de texte précise une couleur (ou qqc comme ca: police, ...), j'obtient une exception "java.lang.IllegalStateException: Attempt to mutate in notification".

code utilisé : doc.setCharacterAttributes(start, length, doc.getStyle(styles[a]), true);
où "doc" et le StyledDocument du JTextPane en cours; "start" le debut de l'endroit à colorer; "length" la taille de la chaine à colorer.

Est ce que vous pouvez me dire comment faire pour éviter ce genre d'erreure ?

merci.
A voir également:

11 réponses

Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
je paris que tu es dans une methode de notification ...; cette erreur se produit generalement lorsque tu essais de modifier la source d'une evenement ...
et c'est ce qui ce passe avec ton doc.set.....

tu peux essayer un truc du genre :


SwingUtilities.invokeLater(new Runnable() {

public void run() {
doc.setCharacterAttributes(start, length, doc.getStyle(styles[a]), true);

}

});

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
Slt
effectivement, avec le morceau de code que tu m'a donné je n'ai plus l'erreur du début. Par contre j'en ai une autre:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: No match available

voila la méthode (l'exception se produit à l'intérieure du run de "SwingUtilities ...).
  pattern = Pattern.compile("" + cmds[a] + "" + motifs[a]);
  matcher = pattern.matcher(this.getText());
  while (matcher.find()) {
    try{
     SwingUtilities.invokeLater(new Runnable() {
      public void run() {
       doc.setCharacterAttributes(matcher.start(), matcher.end()-matcher.start(), doc.getStyle(styles[a]), true);
      }
     });
    }catch (Exception ex){
     ex.printStackTrace();
    }
  }

Les variables pattern et matcher sont déclarées private (elles ne sont pas dans la méthode elle même).
merci.
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
PS: cette méthode est appelée à chaque modifications du texte en cours (j'ai ajouté un listener sur le document).
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
quelle ligne foire ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
doc.setCharacterAttributes(matcher.start(), matcher.end()-matcher.start(), doc.getStyle(styles[a]), true);
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
ben il a rien trouver donc ben il te declenche une exception , je ne vois que ca

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
Slt.

Par exemple: je cherches "%\\d+" dans "%1202145A12"; le programme doit me renvoyer la chaine "%1202145" car elle correspond bien au motif définit précédemment.
j'ai ajouté au code un "System.out.println("" + matcher.group());" pour voir  il n'y avait vraiment rien.
Résultat obtenu : "%1202145".
L'exception ne se produit que dans la ligne doc.setCharacterAttributes(matcher.start(), matcher.end()-matcher.start(), doc.getStyle(styles[a]), true);  (au moment de changer le style).

merci.
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
PS: quand je déplace le system.out (....) pour le mettre dans le "run"  de SwingUtilities(....) , j'obtient la même exception.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
12
ben je sais pas tu dois avoir un pb avec les index de debut et de fin ...
essai pt ca :
pattern.matcher(doc.getText()); // suis pas sur du nom de la methode

quand je travail sur le Texte d'un JTextPane j'utilise toujours ddocument

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
Même la méthode "doc.getText(0, doc.getLength())" ne fonctionne pas (je récupère bien le texte mais j'ai toujours l'exception).
Messages postés
1
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
26 mars 2012

Merci a vous, j'ai pu finalement regle un probleme grace a vous.
:)