从 JTextPane 获取原始文本

发布于 2025-01-05 05:08:53 字数 642 浏览 1 评论 0原文

在我的应用程序中,我使用 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 转换为原始文本?

In my application, I use a JTextPane to display some log information. As I want to hightlight some specific lines in this text (for example the error messages), I set the contentType as "text/html". This way, I can format my text.

Now, I create a JButton that copies the content of this JTextPane into the clipboard. That part is easy, but my problem is that when I call myTextPane.getText(), I get the HTML code, such as :

<html>
  <head>

  </head>
  <body>
    blabla<br>
    <font color="#FFCC66"><b>foobar</b></font><br>
    blabla
  </body>
</html>

instead of getting only the raw content:

blabla
foobar
blabla

Is there a way to get only the content of my JTextPane in plain text? Or do I need to transform the HTML into raw text by myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一念一轮回 2025-01-12 05:08:53

无需使用 ParserCallback。只需使用:

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

No need to use the ParserCallback. Just use:

textPane.getDocument().getText(0, textPane.getDocument().getLength()) );
凉墨 2025-01-12 05:08:53

基于已接受的答案:从 Java 字符串中删除 HTML

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

Based on the accepted answer to: 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());

Slightly modified version of the Html2Text class found on the answer I linked to

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

If you need a more fine-grained handling consider implementing more of the interface defined by HTMLEditorKit.ParserCallback

青丝拂面 2025-01-12 05:08:53

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

You need to do it yourself unfortunately. Imagine if some of the contents was HTML specific, eg images - the text representation is unclear. Include alt text or not for instance.

一刻暧昧 2025-01-12 05:08:53

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

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

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

编辑

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

(Is RegExp allowed? This isn't parsing, isn't it)

Take the getText() result and use String.replaceAll() to filter all tags. Than a trim() to remove leading and trailing whitespaces. For the whitespaces between your first and you last 'blabla' I don't see a general solution. Maybe you can spilt the rest around CRLF and trim all Strings again.

(I'm no regexp expert - maybe someone can provide the regexp and earn some reputation ;) )

Edit

.. I just assumed that you don't use < and > in your text - otherwise it.. say, it's a challenge.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文