HTML ligne par ligne sur un JEditorPane

safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 - 18 août 2004 à 22:04
Nitruk Messages postés 128 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 20 juillet 2009 - 27 août 2008 à 20:44
salut les javateux;
j'ai un JEditorPane qui affiche une page html, j'utilise le constructeur JEditorPane(URL url), la problème c'est que je ve afficher la page ligne par ligne (balise par balise), j'ai fais un Thread qui lit les lignes du fichier et les affiche mais j'ai le code qui est affiché, alor j'ai reglé la propriété type du JEditorPane sur "text/HTML" mais le pbm resiste; silvousplais que dois je faire?

BLATEER

1 réponse

Nitruk Messages postés 128 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 20 juillet 2009
27 août 2008 à 20:44
Tu peux faire ton JEditorPane avec les arguments "text/html" et "" d'office, pour avoir un éditeur de HTML vide, puis avec ton Thread gérer une variable String vide au départ, dans laquelle tu ajoutes ligne par ligne ton texte et que tu attribues au fur et à mesure à ton JEditorPane par setText().

C'est la méthode la plus simple, mais elle a un inconvénient : à chaque ajout lde logne la page sera rehcargée par l'éditeur, ce qui fait notemment remonter le Caret le cas échéant.
Sinon tu peux réellement mettre à jour le domcument au fur et à mesure, en extrayant l'objet document de ton JEditorPAne avec getDocument(), puis en utilisant la méthode insertBeforeEnd() qui ajoute comme son nom l'indique le texte (balises y compris) que tu lui soumets juste avant la balise de fin d'un élément (c'est à dire en l'occurence une balise) que tu lui soumets.

Pour obtenir le dit objet Element, tu peux commencer par donner au constructeur du Pane un document un peu plus élaboré que la chaîne vide que je te suggérais plus haut :

<html>
<head>
contenu du head
</head>

tu peux alors créer un élément ainsi :

JEditorPane pane = new JEditorPane(""text/html", "structure_de_ta_page");
Element monid = pane.getDocument().getElement("monid");

Comme tu l'auras compris, le fait d'appeler alors pane.getDocument().insertBeforeEnd(monid, "montexte") insérera ton texte juste avant la balise

Le Document possède également une méthode getDefaultRootElement() qui doit correspondre à la balise body();

Tu peux aussi utiliser un HTMLEditorKit (à la place de tout ça), et utiliser sa méthode insertHTML.
Il faut alors que tu fasses des essais pour voir combien de bytes prennent réellement les balises et </html>, ainsi qu eles espaces et sauts de lignes qui les séparent, pour pouvoir insérer ton texte au bon endroit. Nous appellerons ce nombre N. Tu devrais alors obtenir :

JEditorPane pane = new JEditorPane();
HTMLDocument doc = (HTMLDocument)pane.getDocument();  //getDocument() est de type Document, mais l'objet
HTMLEditorKit  edit = new HTMLEditorKit();                            //renvoyé est bien un HTMLDocument)

Puis pour chaque ajout de texte :

edit.insertHTML(doc, pane.getText().length() - N, 0, 0, null);

Avec ça tu devrais pouvoir faire ce que tu veux ;)

Nitruk
0
Rejoignez-nous