Java 从JTextPane获取原始文本

Java 从JTextPane获取原始文本,java,swing,jtextpane,Java,Swing,Jtextpane,在我的应用程序中,我使用JTextPane来显示一些日志信息。由于我想高亮显示文本中的某些特定行(例如错误消息),我将contentType设置为“text/html”。这样,我可以格式化我的文本 现在,我创建了一个JButton,它将这个JTextPane的内容复制到剪贴板中。这一部分很简单,但我的问题是,当我调用myTextPane.getText()时,我会得到HTML代码,例如: <html> <head> </head> <bod

在我的应用程序中,我使用
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>

有没有办法只获取我的
JTextPane
的纯文本内容?或者我需要自己将HTML转换为原始文本吗?

不幸的是,您需要自己完成。想象一下,如果某些内容是特定于HTML的,例如图像,那么文本表示是不清楚的。例如,是否包含alt文本。

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

获取getText()结果并使用String.replaceAll()筛选所有标记。然后使用trim()删除前导空格和尾随空格。对于第一个和最后一个“blabla”之间的空白,我看不出通用的解决方案。也许你可以把剩下的都撒在CRLF上,然后再修剪所有的线

(我不是regexp专家-也许有人可以提供regexp并赢得一些声誉;)

编辑


。。我只是假设您在文本中不使用
,否则会。。比如说,这是一个挑战。

基于以下公认答案:

在我链接到的答案中找到的
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();
    }
}

如果您需要更细粒度的处理,考虑实现更多的由

< P>定义的接口,不需要使用PARSerCURBACK。只需使用:

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

这确实是一个很好的解决方案。。。除了我丢失了所有的换行符,然后我的最后一个字符串只有一行。太糟糕了,因为我真的很喜欢这个解决方案!是的,文档不存储换行符,它们是由其他解决方案手动添加的。
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();
    }
}
textPane.getDocument().getText(0, textPane.getDocument().getLength()) );