Attempt to mutate in notification 2 [Résolu]

Signaler
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
-
Bonjour à tous.
Il y a quelque temps, j'ai posté un message consernant l'exception "Attempt to mutate in notification".
On m'a proposé cette solution :
   SwingUtilities.invokeLater(new Runnable() {
      public void run() {
       //La ligne qui me pose problème.
      }
     });

Avec cette métode, j'obtiens une autre exception (==> je n'ai pas de valeurs).
Je me demandais si cette méthode n'attendait pas que certaines choses soient finis avec d'excécuter le code qui est à l'intérieur.
Exemple :
 //Pour chaques commandes
  for (a=0; a<cmds.length; a++) {
   
   //Init du motif et du chercheur
   pattern = Pattern.compile("" + cmds[a] + "" + motifs[a]);
   matcher = pattern.matcher(this.getText());
   
   //Tant que l'on trouve
   while (matcher.find()) {
    
    System.out.println("" + matcher.group() + " = " + styles[a]);
    
    //On colore
    try{
     SwingUtilities.invokeLater(new Runnable() {
      public void run() {
       doc.setCharacterAttributes(matcher.start(), matcher.end()-matcher.start(), doc.getStyle(styles[a]), true);
      }
     });
    }catch (Exception ex){
    }
    
   }
   
  }

Ici, lorsque je lance le code, on m'indique je n'ai pas d'occurence. Pourtant, juste avant, j'ai mis un System.out.println("une occurence trouvée"); qui m'indique qu'il y a des occurences. MAIS ( xD ) lorsque je passe dans le "SwingUtilities ...", je n'ai plus d'occurence. Comme si on les avait déja toutes passée en revu (et donc que les valeurs en cours etaient devenues nulles).

merci de votre aide.

1 réponse

Messages postés
845
Date d'inscription
mardi 25 avril 2006
Statut
Membre
Dernière intervention
1 août 2017
1
Exusez moi ...
je viens de trouver une solution:
  SwingUtilities.invokeLater(new Runnable() {
   
   //On enregistre les paramètres actuels
   private final int s = start;
   private final int e = end;
   private final String st = style;
   
   //Dés qu'on le pourrat, on colorera la commande (correspondant aux paramètres enregsitrés)
   public void run() {
    doc.setCharacterAttributes(s, e-s, doc.getStyle(st), true);
   }
   
  });