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.
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
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)); } }
ça fonctionne presque normalement...
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"); } } }); }
Mais dés que j'utilise un undoManager pour filtrer les changements de styles, rien ne va plus !
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é.
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); } };
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
Partager