2009-12-07 6 views
7

В моем приложении я использую JTextPane для отображения некоторых данных журнала. Поскольку я хочу закрепить некоторые конкретные строки в этом тексте (например, сообщения об ошибках), я установил contentType как «text/html». Таким образом, я могу отформатировать текст.Получение исходного текста из JTextPane

Теперь я создаю JButton, который копирует содержимое этого JTextPane в буфер обмена. Та часть легко, но моя проблема в том, что, когда я называю myTextPane.getText(), я получаю HTML-код, например:

<html> 
    <head> 

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

вместо того, чтобы получать только содержание сырого:

blabla 
foobar 
blabla 

Есть ли способ получить только содержимое моего JTextPane в виде обычного текста? Или мне нужно преобразовать HTML в исходный текст?

ответ

5

На основании принятого ответа на: 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()); 

слегка модифицированную версию Html2Text класса, найденный на ответ, который я связан с

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

Если вам нужна более мелкозернистой обработка считают реализация большего количества интерфейса, определенного HTMLEditorKit.ParserCallback

2

Вам нужно сделать это самостоятельно, к сожалению. Представьте себе, если какое-то содержимое было специфичным для HTML, например, изображения - текстовое представление неясно. Включите текст alt или нет, например.

2

(Is RegExp разрешено? Это не разбор, не правда ли)

Возьмите результат GetText() и использовать String.replaceAll(), чтобы отфильтровать все теги. Чем обрезать(), чтобы удалить ведущие и завершающие пробелы. Для пробелов между вашим первым и последним «blabla» я не вижу общего решения. Возможно, вы можете проливать остальную часть вокруг CRLF и снова обрезать все строки.

(я не эксперт регулярное_выражение - может быть, кто-то может обеспечить регулярное выражение и заработать репутацию;))

Редактировать

.. Я просто предположил, что вы не используете < и > в вашем тексте - иначе это .. скажем, это вызов.

16

Не нужно использовать ParserCallback. Просто используйте:

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

Это действительно действительно хорошее решение ... за исключением того, что я потерял все разрывы строк, а затем моя последняя строка находится только в одной строке. Жаль, потому что мне действительно понравилось это решение! – romaintaz

+0

Да, в документе не хранятся разрывы строк, они вручную добавляются другим решением. – camickr

Смежные вопросы