Bonjour,

J'ai un petit problème lorsque je veux changer le style d'une zone sélectionnée d'un JTextPane défini avec un HTML kit. J'obtiens une erreur de "Casting". le message est le suivant :
java.lang.ClassCastException: java.lang.String cannot be cast to javax.swing.text.html.HTML$Tag

J'ai déjà passé plusieurs jours sur ce problème et je n'arrive pas à le résoudre. Il semble que cela vient lors de l'invocation de la méthode : setParagraphAttributes(..).
Ci-dessous, une classe qui me sert d'exemple. Merci d'avance pour tout conseil ou toute suggestion.

Gégé

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
147
148
149
150
151
152
153
154
155
156
157
 
package test;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
public class TestTextPane extends javax.swing.JFrame implements  ActionListener,  PropertyChangeListener 
{
	private static final long serialVersionUID = 1L;
	private final HTMLEditorKit htmlKit = new HTMLEditorKit();
	private  HTMLDocument htmlDoc = null;
	private final javax.swing.JPanel 	frameContentPane 	= new javax.swing.JPanel();
	private javax.swing.JButton 		Finish          = null;
	private javax.swing.JButton 		HTML          = null;
	private javax.swing.JButton 		newstyle      = null;
	private javax.swing.JLabel 		labmes         = null;
	private javax.swing.JTextField		filename       = null;
	private javax.swing.JLabel 		Message      = null;
	private javax.swing.JTextPane 	myTextPane = null;
	private javax.swing.JScrollPane 	scrollPane    = null;
	private static java.net.URL  		url              = null;
	private int  selStart, selEnd;
	public TestTextPane() {super();initialize();}
	public void actionPerformed(java.awt.event.ActionEvent e)
	{
		 try {
		 if (e.getSource() == Finish)   	{ System.exit(0);}
		 if (e.getSource() == HTML)   		{ loadHTML();}
		 if (e.getSource() == newstyle)   	{ changeParagraphStyle();}
		 } catch (Exception ex) {}
	}
    private void initialize() 
    {
    	    setName("TestTextPane");
    		setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    		setSize(557, 451);
    		myTextPane = new javax.swing.JTextPane();
    		myTextPane.setName("myTextPane");
    		myTextPane.setBounds(0, 0, 11, 6); 
    		HTML = new javax.swing.JButton();
    		HTML.setName("HTLM");
    		HTML.setText("Load ");
    		HTML.setBounds(66, 303, 99, 25);
    		newstyle = new javax.swing.JButton();
    		newstyle.setName("newStyle");
    		newstyle.setText("New Style");
    		newstyle.setBounds(225, 303, 99, 25);
    		Finish = new javax.swing.JButton();
    		Finish.setName("Finish");
    		Finish.setText("Finish");
    		Finish.setBounds(390, 303, 101, 25);
    		Message = new javax.swing.JLabel();
    		Message.setName("Message");
    		Message.setText(" ");
    		Message.setBounds(68, 283, 419, 14);
    		Message.setForeground(new java.awt.Color(255,0,0));
    		labmes = new javax.swing.JLabel();
    		labmes.setName("labmes");
    		labmes.setFont(new java.awt.Font("Arial", 1, 12));
    		labmes.setText("Load from URL");
    		labmes.setBounds(127, 256, 106, 14);
    		labmes.setForeground(java.awt.Color.black);
    		filename  = new javax.swing.JTextField();
    		filename.setName("Pagename");
    		filename.setBounds(237, 252, 221, 20);
    		filename.setText("http://www.google.com/");
    		frameContentPane.setName("myFrame");
    		frameContentPane.setLayout(null);
    		scrollPane = new javax.swing.JScrollPane();
    		scrollPane.setName("scrollPane");
    		scrollPane.setBounds(23, 18, 513, 205);
    		scrollPane.setViewportView(myTextPane);
    		frameContentPane.add(scrollPane, scrollPane.getName());
    		frameContentPane.add(HTML, HTML.getName());
    		frameContentPane.add(newstyle, newstyle.getName());
    		frameContentPane.add(Finish, Finish.getName());
    		frameContentPane.add(Message, Message.getName());
    		frameContentPane.add(filename, filename.getName());
    		frameContentPane.add(labmes, labmes.getName());
    		setContentPane( frameContentPane);
    		HTML.addActionListener(this);
    		newstyle.addActionListener(this);
    		Finish.addActionListener(this);
    		java.awt.Dimension fenetre =  this.getSize();
    	    int sizex = fenetre.width, sizey = fenetre.height;
    	    java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    		setBounds((screen.width - sizex) / 2,(screen.height - sizey) / 2, sizex, sizey); 
    		myTextPane.setEditable(true);
    		myTextPane.setEditorKit(htmlKit);
    		myTextPane.setText("<html><body>Hello. Specify the HTML page to be loaded then click on the Load Button.</body></html>" );
    		myTextPane.addPropertyChangeListener(this);
            this.setVisible(true);
    }
    private void loadHTML()throws Exception
    {
    	Message.setText("");
    	try 
        {
    		htmlDoc = (HTMLDocument) myTextPane.getDocument();
    		String fn = filename.getText().trim();
    		if (fn== null || fn.equals("")){Message.setText("You need to enter the file to load. ");return;	}
    		url = new  java.net.URL(fn);
        	if (url==null) throw  new java.io.IOException();
        	myTextPane.setPage(url);
    		myTextPane.requestFocus();
 
        } 
        catch (Exception ex) {Message.setText( "Loading error.");}
    }
	public static void main(java.lang.String[] args) {new TestTextPane();}
	public void propertyChange(PropertyChangeEvent evt) 
	{
      String propertyName = evt.getPropertyName();
      System.out.println(propertyName);   // for debugging purpose
      if (propertyName.equals("page")|| propertyName.equals("document")) 
      {
        System.out.println("The HTML page is loaded ...");
        myTextPane.setCaretPosition(0);
  		myTextPane.getCaret().setDot(0);
  		myTextPane.setSelectionStart(0); 
  		myTextPane.setSelectionEnd(1);
  		myTextPane.getCaret().setSelectionVisible(true);
  		myTextPane.requestFocus();
  		Message.setText("File loaded successfully...");
      }
	}
	public void changeParagraphStyle() 
	{
		try 
		{
	  		String selText = myTextPane.getSelectedText();
			if (selText == null )  {Message.setText("No selected field for new style"); return ; } // aucune ligne sélectionnée	
			Message.setText("");
			selStart = myTextPane.getSelectionStart();
			selEnd = myTextPane.getSelectionEnd();
		  	Style defaultStyle = myTextPane.getStyle(StyleContext.DEFAULT_STYLE);
		  	Style style = myTextPane.addStyle("paragraph", defaultStyle);
		  	StyleConstants.setBold(style, true);
		  	StyleConstants.setFontSize(style, 14);
		  	StyleConstants.setFontFamily(style, "Serif");
		  	StyleConstants.setItalic(style, true); 
		  	StyleConstants.setUnderline(style, true); 
		  	StyleConstants.setForeground(style, new Color(0,0,255));
		  	myTextPane.setParagraphAttributes( style, true);
		}
		catch (Exception ex )
		{
			Message.setText("Error when changing style");
			System.out.println(ex.toString());
		}
	}
}