Получение необработанного текста из JTextPane - PullRequest
7 голосов
/ 07 декабря 2009

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

Теперь я создаю 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 в необработанный текст?

Ответы [ 4 ]

17 голосов
/ 07 декабря 2009

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

textPane.getDocument().getText(0, textPane.getDocument().getLength()) );
5 голосов
/ 07 декабря 2009

На основании принятого ответа на: Удаление HTML из строки Java

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 голосов
/ 07 декабря 2009

(Разрешается ли RegExp? Это не анализ, не так ли)

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

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

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

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

2 голосов
/ 07 декабря 2009

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

...