2009-12-07 18 views
7

In meiner Anwendung verwende ich eine JTextPane, um einige Protokollinformationen anzuzeigen. Da ich einige spezielle Zeilen in diesem Text beleuchten möchte (zum Beispiel die Fehlermeldungen), setze ich contentType als "text/html". Auf diese Weise kann ich meinen Text formatieren.Abrufen von Rohtext von JTextPane

Jetzt erstelle ich eine JButton, die den Inhalt dieser JTextPane in die Zwischenablage kopiert. Dieser Teil ist einfach, aber mein Problem ist, dass, wenn ich myTextPane.getText() nennen, ich den HTML-Code zu erhalten, wie zum Beispiel:

<html> 
    <head> 

    </head> 
    <body> 
    blabla<br> 
    <font color="#FFCC66"><b>foobar</b></font><br> 
    blabla 
    </body> 
</html> 

stattdessen nur der rohen Inhalt bekommen:

blabla 
foobar 
blabla 

Gibt es eine Möglichkeit um nur den Inhalt meiner JTextPane im Klartext zu bekommen? Oder muss ich den HTML-Code selbst in Rohtext umwandeln?

Antwort

5

auf der akzeptierte Antwort Basierend auf: Removing HTML from a Java String

MyHtml2Text parser = new MyHtml2Text(); 
try { 
    parser.parse(new StringReader(myTextPane.getText())); 
} catch (IOException ee) { 
    //handle exception 
} 
System.out.println(parser.getText()); 

leicht modifizierte Version der Html2Text Klasse auf die Antwort fand ich

import java.io.IOException; 
import javax.swing.text.html.*; 
import javax.swing.text.html.parser.*; 

public class MyHtml2Text extends HTMLEditorKit.ParserCallback { 
    StringBuffer s; 
    public MyHtml2Text() {} 
    public void parse(Reader in) throws IOException { 
     s = new StringBuffer(); 
     ParserDelegator delegator = new ParserDelegator(); 
     delegator.parse(in, this, Boolean.TRUE); 
    } 
    public void handleText(char[] text, int pos) { 
     s.append(text); 
     s.append("\n"); 
    } 
    public String getText() { 
     return s.toString(); 
    } 
} 

Wenn Sie eine feinkörnige Handhabung müssen

verknüpft betrachten Implementieren mehr der Schnittstelle von HTMLEditorKit.ParserCallback

2

Sie müssen es leider selbst tun. Stellen Sie sich vor, wenn einige der Inhalte HTML-spezifisch wären, zB Bilder - die Textdarstellung ist unklar. Fügen Sie alternativ Text ein oder nicht.

2

(I RegExp erlaubt? Dies ist das Parsen nicht, ist es nicht)

Nehmen Sie das getText() Ergebnis und verwendet String.replaceAll() Alle Tags zu filtern. Als trim(), um führende und nachfolgende Leerzeichen zu entfernen. Für die Whitespaces zwischen deinem ersten und letzten "Blabla" sehe ich keine allgemeine Lösung. Vielleicht kannst du den Rest um CRLF verschütten und alle Strings wieder trimmen.

(ich bin kein Experte regexp - vielleicht kann jemand den regexp bieten und einige Ruf verdienen;))

bearbeiten

.. Ich nahm einfach an, dass Sie nicht < und > verwenden in deinem Text - sonst ist es ... es ist eine Herausforderung.

16

Keine Notwendigkeit, den ParserCallback zu verwenden. Verwenden Sie einfach:

textPane.getDocument().getText(0, textPane.getDocument().getLength())); 
+0

Das ist in der Tat eine wirklich gute Lösung ... außer dass ich alle Zeilenumbrüche verloren, und dann ist meine letzte String nur in einer Zeile. Schade, weil mir diese Lösung wirklich gefallen hat! – romaintaz

+0

Ja, das Dokument speichert keine Zeilenumbrüche, sie wurden manuell von der anderen Lösung hinzugefügt. – camickr

Verwandte Themen