Obtenir 'la Tentative de muter de notification' exception
Mon objectif est de mettre en œuvre des colorants bleu de mots-clés écrits par l'utilisateur dans JTextPane. C'est de cette façon que mon code ressemble:
private class DocumentHandler implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent ev) {
}
@Override
public void insertUpdate(DocumentEvent ev) {
highlight();
}
@Override
public void removeUpdate(DocumentEvent ev) {
highlight();
}
private void highlight() {
String code = codePane.getText();
SimpleAttributeSet defSet = new SimpleAttributeSet();
StyleConstants.setForeground(defSet, Color.BLACK);
doc.setCharacterAttributes(0, code.length(), defSet, true);
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setForeground(set, Color.BLUE);
for (String keyword : keywords) {
Pattern pattern = Pattern.compile(keyword + "(\\[\\])*");
Matcher matcher = pattern.matcher(code);
while (matcher.find()) {
//Just for test
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end());
System.out.println(" Found: " + matcher.group());
doc.setCharacterAttributes(matcher.start(), keyword.length(), set, true);
}
}
}
}
Après avoir tapé n'importe quoi de volet-je obtenir:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)
at javax.swing.text.DefaultStyledDocument.setCharacterAttributes(DefaultStyledDocument.java:500)
at jnotepad.MainPanel$DocumentHandler.highlight(MainPanel.java:121)
at jnotepad.MainPanel$DocumentHandler.insertUpdate(MainPanel.java:108)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:202)
at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:749)
Comment résoudre mon problème? Je devrais peut-être utiliser autre chose que DocumentListener?
OriginalL'auteur user2102972 | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'invoquer des modifications au document de l'Event Dispatcher Fil.
Essayez ceci:
highlight()
est en cours d'exécution à partir de fil mal. Plutôt,invokeLater(Runnable)
résout les problèmes, car il reporte l'exécution jusqu'à ce Document verrou est libéré.OriginalL'auteur moeTi
J'ai eu le même problème, je l'ai résolu en utilisant ceci:
OriginalL'auteur user2845064