Bonjour

Après avoir épuisé toutes les pistes... je me remets à vous pour m'aider à trouver une solution !

J'ai créé un éditeur qui modifie la couleur des mots suivant le contexte dans lequel ils se trouvent.
Jusqu'à là, rien d'extraordinaire !
J'ai mon parseur, qui analyse le texte que tape le programmeur et ensuite, j'utilise la méthode setCharacterAttributes pour affecter la couleur. Pour cela, je passe par un thread.

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
 
public class AtelierDocument extends DefaultStyledDocument {
 
	public void setCharacterAttributes(List<Style> list) {
 
		try {
			writeLock();
			List<Style> styles = StyleBuffer.retourneStyles();
			while (!styles.isEmpty()) {
				Style style = styles.get(0);
				styles.remove(style);
				int taille = style.getTaille();
				if (taille == -1)
					taille = getLength();
				if (style.getPosition() > getLength())
					continue;
				if (taille != 0) {
					setCharacterAttributes2(style.getPosition(), taille, style.getStyle(), true);
				}
			}
		} finally {
			writeUnlock();
		}
	}
 
	private void setCharacterAttributes2(int offset, int length, AttributeSet s, boolean replace) {
		if (length == 0) {
			return;
		}
 
		DefaultDocumentEvent changes = new DefaultDocumentEvent(offset, length, DocumentEvent.EventType.CHANGE);
 
		// split elements that need it
		buffer.change(offset, length, changes);
 
		AttributeSet sCopy = s.copyAttributes();
 
		// PENDING(prinz) - this isn't a very efficient way to iterate
		int lastEnd = Integer.MAX_VALUE;
		for (int pos = offset; pos < (offset + length); pos = lastEnd) {
			Element run = getCharacterElement(pos);
			lastEnd = run.getEndOffset();
			if (pos == lastEnd) {
				// offset + length beyond length of document, bail.
				break;
			}
			MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes();
			changes.addEdit(new AttributeUndoableEdit(run, sCopy, replace));
			if (replace) {
				attr.removeAttributes(attr);
			}
			attr.addAttributes(s);
		}
		changes.end();
		fireChangedUpdate(changes);
		fireUndoableEditUpdate(new UndoableEditEvent(this, changes));
 
	}
}
Le code du thread :

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
 
	public static void appliquer(final int nombre, final int decal) {
		SwingUtilities.invokeLater(new Runnable() {
 
			public void run() {
				try {
					if (appliquer)
						document.setCharacterAttributes(StyleBuffer.retourneStyles());
					else
						StyleBuffer.effacerStyle();
				} catch (Exception e) {
					System.out.println("Erreur application des styles");
				}
			}
 
		});
	}
ça fonctionne presque normalement...
Mais dés que j'utilise un undoManager pour filtrer les changements de styles, rien ne va plus !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
			undoManager = new UndoManager()//;
			{
				public synchronized boolean addEdit(UndoableEdit anEdit) {
					if (anEdit instanceof AbstractDocument.DefaultDocumentEvent) {
						AbstractDocument.DefaultDocumentEvent de = (AbstractDocument.DefaultDocumentEvent) anEdit;
						if (de.getType() == DocumentEvent.EventType.CHANGE) {
							return false;
						}
					}
					return super.addEdit(anEdit);
				}
 
			};
En utilisant le undo/redo, rapidement j'ai le curseur qui disparait et ensuite, l'affichage de la zone texte se bloque ou mon texte est décalé.

Après plusieurs tests, je ne pense pas que mon problème soit dû à l'utilisation des threads. C'est la méthode setcharacterAttributes qui semble se mélanger les pinceaux à un moment que je n'arrive pas à déterminer !

Voici le l'adresse de mon code.
https://linotte.dev.java.net/source/...linotte/frame/

Il n'est pas très beau... je sais...

J'espère qu'une personne trouvera une solution....

Ronan