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