2009-12-07 29 views
7

En mi aplicación, uso JTextPane para mostrar información de registro. Como quiero resaltar algunas líneas específicas en este texto (por ejemplo, los mensajes de error), configuré contentType como "text/html". De esta manera, puedo formatear mi texto.Obtención de texto sin procesar desde JTextPane

Ahora, creo un JButton que copia el contenido de este JTextPane en el portapapeles. Esa parte es fácil, pero mi problema es que cuando llamo myTextPane.getText(), consigo el código HTML, como por ejemplo:

<html> 
    <head> 

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

en lugar de obtener sólo el contenido en bruto:

blabla 
foobar 
blabla 

¿Hay una manera para obtener solo el contenido de mi JTextPane en texto sin formato? ¿O necesito transformar el HTML en texto sin procesar yo solo?

Respuesta

5

Sobre la base de la respuesta aceptada a: 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()); 

versión ligeramente modificada de la clase Html2Text se encuentran en la respuesta que he vinculado a

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(); 
    } 
} 

Si necesita un manejo más preciso considerar implementando más de la interfaz definida por HTMLEditorKit.ParserCallback

2

Tienes que hacerlo tú mismo desafortunadamente. Imagine si algunos de los contenidos eran específicos de HTML, por ejemplo, imágenes: la representación de texto no está clara. Incluye texto alternativo o no, por ejemplo.

2

(Is RegExp permitido? Esto no es analizar, no es así)

Tome el resultado getText() y utilizar String.replaceAll() para filtrar todas las etiquetas. Que un recorte() para eliminar los espacios en blanco iniciales y finales. Para los espacios en blanco entre su primer y último 'blabla' no veo una solución general. Tal vez puedas derramar el resto alrededor de CRLF y recortar todas las cadenas de nuevo.

(no soy experto expresión regular - tal vez alguien puede proporcionar la expresión regular y ganar algo de reputación;))

Editar

.. acabo de asumir que no utiliza < y > en su texto; de lo contrario, es un desafío.

16

No es necesario usar ParserCallback. Solo use:

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

De hecho, es una muy buena solución ... excepto que perdí todos los saltos de línea, y entonces mi String final está solo en una línea. ¡Qué lástima, porque realmente me gustó esta solución! – romaintaz

+0

Sí, el documento no almacena saltos de línea, sino que se agregan manualmente por la otra solución. – camickr

Cuestiones relacionadas