8

在我的应用程序中,我使用 aJTextPane来显示一些日志信息。由于我想突出显示此文本中的某些特定行(例如错误消息),我将其设置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

4 回答 4

18

无需使用 ParserCallback。只需使用:

textPane.getDocument().getText(0, textPane.getDocument().getLength()) );
于 2009-12-07T16:59:24.843 回答
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

于 2009-12-07T13:27:32.260 回答
2

不幸的是,您需要自己做。想象一下,如果某些内容是 HTML 特定的,例如图像 - 文本表示不清楚。例如,是否包含替代文本。

于 2009-12-07T12:33:34.973 回答
2

(允许 RegExp 吗?这不是解析,不是吗)

获取 getText() 结果并使用 String.replaceAll() 过滤所有标签。比 trim() 删除前导和尾随空格。对于你的第一个和你最后一个'blabla'之间的空格,我没有看到一个通用的解决方案。也许您可以将其余部分洒在 CRLF 周围并再次修剪所有字符串。

(我不是正则表达式专家——也许有人可以提供正则表达式并赢得一些声誉;))

编辑

..我只是假设你不在你的文本中使用<>- 否则它......说,这是一个挑战。

于 2009-12-07T12:36:36.620 回答