2009-12-07 117 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特定的,例如图像 - 文本表示不清楚。例如,包括替代文字或不包含。

2

(是正则表达式可以吗?这是不解析,是不是)

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

(我不是正则表达式的专家 - 也许有人可以提供正则表达式,并赚了一些声誉;))

编辑

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

16

定义的接口不需要使用ParserCallback。只需使用:

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

这确实是一个非常好的解决方案...除了我失去了所有换行符,然后我的最终字符串只在一行中。太糟糕了,因为我非常喜欢这个解决方案! – romaintaz 2009-12-08 06:49:16

+0

是的,文档不存储换行符,它们是通过其他解决方案手动添加的。 – camickr 2009-12-08 07:27:48