Salut à tous,

voilà en ce moment je cherche à créér un JTextPane sur lequel je saurai faire des append(text) comme dans une JTextArea, jusque là rien de bien compliqué, mais en plus je voudrai surtout pouvoir changer de style de texte à chaque fois que je veux faire un append, et ça ça ne marche pas.
Avec les classes ci-dessous le style de texte ne change jamais...

La classe pour les styles, très simple :
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
/**
 * File DefaultStyle.java
 * Created on 17 mai 2008
 */
 
package util.graphics.text;
 
import java.awt.Color;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
 
/**
 * 
 * @author Evenstar
 */
public class SimpleStyle extends DefaultStyledDocument
{
    private StyleContext context;
    private Style defaultStyle;
    private String current;
 
    public SimpleStyle()
    {
        this(new StyleContext());
    }
 
    public SimpleStyle(StyleContext context) 
    {
        super(context);
 
        this.context = context;
        this.current = StyleContext.DEFAULT_STYLE;
        this.defaultStyle = context.getStyle(current);
    }
 
    public String getCurrentStyleName()
    {
        return current;
    }
 
    public  void setCurrentStyle(String styleName)
    {
        this.current = styleName;
    }
 
    public void setTextStyle(int start, int length, String styleName)
    {
        setCharacterAttributes (start, length,getStyle (styleName), true);
    }
 
    public  void addStyle(String styleName, Color textColor)
    {
        Style newStyle = context.addStyle(styleName, defaultStyle);
        StyleConstants.setForeground(newStyle, textColor);
    }
 
    public void addStyle(String styleName, int fontsize, String fontname, 
            Color textColor, boolean isBold, boolean isItalic, boolean isUnderline)
    {
        Style newStyle = context.addStyle(styleName, defaultStyle);
 
        StyleConstants.setFontSize(newStyle, fontsize);
        StyleConstants.setFontFamily(newStyle, fontname);
        StyleConstants.setForeground(newStyle, textColor);
        StyleConstants.setBold(newStyle, isBold);
        StyleConstants.setItalic(newStyle, isItalic);
        StyleConstants.setUnderline(newStyle, isUnderline);
    }
 
    public void insertString(int offset, String text, AttributeSet a) throws BadLocationException 
    {
        super.insertString(offset, text, getStyle(current));
        setTextStyle(offset, text.length(), current);
    }
}
La classe héritée pour le TextPane, simple elle aussi :
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
60
61
62
63
64
 
/**
 * File SimpleTextPane.java
 * Created on 17 mai 2008
 */
package util.graphics.text;
 
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
 
/**
 * 
 * @author Evenstar
 */
public class SimpleTextPane extends JTextPane 
{
    private SimpleStyle style;
 
    public SimpleTextPane()
    {
        this(new SimpleStyle());
    }
 
    public  SimpleTextPane(SimpleStyle style)
    {
        super(style);
        this.style = style;
    }
 
    public void append(String text)
    {
        try 
        {
            String txt = this.getText();
            if(txt != null)
                style.insertString(txt.length(), text, null);
            else
            {
                style.insertString(0, text, null);
            }
        } 
        catch (BadLocationException ex) 
        {
            ex.printStackTrace();
        }
    }
 
    public void append(String text, String styleName)
    {
        String old = style.getCurrentStyleName();
        style.setCurrentStyle(styleName);
 
        try
        {
            style.insertString(this.getText().length(), text, null);
        }
        catch(BadLocationException ex)
        {
            ex.printStackTrace();
        }
 
        style.setCurrentStyle(old);
    }
}
Et la classe de test qui dessine une fenêtre bidon :
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
 
/**
 * File TextPaneTest.java
 * Created on 17 mai 2008
 */
 
package test;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import util.graphics.text.SimpleStyle;
import util.graphics.text.SimpleTextPane;
 
/**
 *
 * @author Absil Romain
 */
public class TextPaneTest 
{
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
        new TextFrame();
    }
}
 
class TextFrame extends JFrame
{
    //private OutStyle style;
 
    public TextFrame()
    {
        setSize(800, 600);
        setTitle("Title");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        final SimpleStyle style = new SimpleStyle();
        style.addStyle("error", Color.RED);
 
        SimpleTextPane pane = new SimpleTextPane();
        add(new JScrollPane(pane), BorderLayout.CENTER);
 
 
 
//        style = new OutStyle(new StyleContext());
//        pane.setDocument(style);
 
        JButton change = new JButton("Change style");
        change.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if(style.getCurrentStyleName().equals("error"))
                    style.setCurrentStyle(StyleContext.DEFAULT_STYLE);
                else
                    style.setCurrentStyle("error");
            }
        });
        add(change, BorderLayout.SOUTH);
 
        setVisible(true);
 
        pane.append("Texte normal\n");
        try
        {
            Thread.sleep(1000L);
        }
        catch(InterruptedException ex)
        {
        }
 
        style.setCurrentStyle("error");
        pane.append("error");
 
 
    }
}
 
class OutStyle extends DefaultStyledDocument
{
    private String styleType = "normal";
 
    public OutStyle(StyleContext context)
    {
        super(context);
        initStyle(context);
    }
 
    public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException
    {
        try
        {
            if (str.equals("error"))
                super.insertString(offs, str, getStyle("error"));
            else
                super.insertString(offs, str, getStyle("normal"));
        }
        catch (BadLocationException ex)
        {
            ex.printStackTrace();
        }
    }
 
    public void setStyleType(String styleType)
    {
        if(styleType.equals("error"))
            this.styleType = "error";
        else
            this.styleType = "normal";
    }
 
    public String getStyleType()
    {
        return styleType;
    }
 
    public void initStyle(StyleContext styles)
    {
        Style def = styles.getStyle (StyleContext.DEFAULT_STYLE);
 
        Style normal = styles.addStyle("normal", def);
        StyleConstants.setFontFamily(normal, "Courier");
        StyleConstants.setFontSize(normal, 11);
        StyleConstants.setForeground(normal, Color.BLACK);
        StyleConstants.setBold(normal, false);
 
        Style error = styles.addStyle("error", normal);
        StyleConstants.setForeground(error, Color.RED);
        StyleConstants.setBold(error, true);
    }
}

Franchement je ne trouve pas. Notez que j'ai essayé de faire des
Code : Sélectionner tout - Visualiser dans une fenêtre à part
setCharacterAttributes (positionDepart, longueur, style, true)
dans les append pour forcer la mise à jour du style mais ça fait rien...

Quelqu'un a-t-il une idée de comment procéder?

N.B. : si vous copiez/collez le code faites attentions aux déclarations package.