将 JTextPane 设置为内容类型 HTML 并使用字符串构建器

Posted

技术标签:

【中文标题】将 JTextPane 设置为内容类型 HTML 并使用字符串构建器【英文标题】:setting JTextPane to content type HTML and using string builders 【发布时间】:2012-02-22 16:34:52 【问题描述】:

我正在使用字符串构建器将文本附加到我的 JTextPane,我已将内容类型设置为 pane.setContentType("text/html");,但我的 JTextPane 上实际上没有出现任何文本。

这是我的追加示例:

buildSomething.append("<b style=\"color:pink\">"+Birthday+"</span>");

我做错了什么吗?我该如何解决它?

【问题讨论】:

【参考方案1】:

每次调用JTextPane.setText(...) 都会确定一个新的内容类型。以"&lt;html&gt;" 开头的文本,你就有了HTML。

一个新文档被创建,在你的例子中是 HTMLDocument。


@mKorbel:以下每次都会为 JTextPane 创建 HTML。

    buildSomething.append("<html>");
    buildSomething1.append("<html>");
    for (int i = 0; i < 10; i++) 
        buildSomething.append("<span style=\"color:red\">" + myBirthday + "</span>");
        buildSomething1.append("<b style=\"color:blue\">" + myBirthday + "</b>");
    

【讨论】:

所以buildSomething.append("&lt;html&gt;&lt;b style=\"color:pink\"&gt;"+Birthday+"&lt;/span&gt;&lt;/html&gt;");?我试过了,还是一样。 你做了buildSomething = new StringBuilder(); buildSomething.append("&lt;html&gt;" + ...); textPane.setText(buildSomething.toString());吗? 我必须将 JTextPane 中的属性 contentType 设置为 text/html 才能使其工作。【参考方案2】:

@乔普·埃根

第一。循环生成

buildSomething.append("<span style=\"color:pink\">" + myBirthday + "</span>");

第二。循环生成相同的输出,我认为是否包裹在 &lt;html&gt; ..&lt;html&gt; 中并不重要,因为有 pane.setContentType("text/html");

和(我在这里发布的代码不正确&lt;html&gt; ..&lt;/html&gt;

buildSomething1.append("<html><span style=\"color:pink\">" 
    + myBirthday + "</span></html>");

import java.awt.*;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLDocument;

public class MyTextPane implements Runnable 

    private JFrame frm;
    private JScrollPane jsp;
    private JTextPane jta;
    private StringBuilder buildSomething = new StringBuilder();
    private StringBuilder buildSomething1 = new StringBuilder();
    final String myBirthday = "Birthday";

    public MyTextPane() 
        for (int i = 0; i < 10; i++) 
            buildSomething.append("<span style=\"color:red\">" + myBirthday + "</span>");
            buildSomething1.append("<span style=\"color:blue\">" + myBirthday + "</span>");
        
        jta = new JTextPane();
        jta.setContentType("text/html");
        jta.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        jta.setText(myBirthday);
        jsp = new JScrollPane(jta);
        jsp.setPreferredSize(new Dimension(250, 450));
        frm = new JFrame("awesome");
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setLayout(new BorderLayout());
        frm.add(jsp, BorderLayout.CENTER);
        frm.setLocation(100, 100);
        frm.pack();
        frm.setVisible(true);
        new Thread(this).start();
    

    @Override
    public void run() 
        try 
            Thread.sleep(1500);
         catch (Exception e) 
            e.printStackTrace();
        
        SwingUtilities.invokeLater(new Runnable() 

            @Override
            public void run() 
                jta.setText(null);
                HTMLDocument doc = (HTMLDocument) jta.getStyledDocument();
                try 
                    doc.insertAfterEnd(doc.getCharacterElement(doc.getLength()), buildSomething.toString());
                 catch (BadLocationException ex) 
                    Logger.getLogger(MyTextPane.class.getName()).log(Level.SEVERE, null, ex);
                 catch (IOException ex) 
                    Logger.getLogger(MyTextPane.class.getName()).log(Level.SEVERE, null, ex);
                
            
        );
        try 
            Thread.sleep(1500);
         catch (Exception e) 
            e.printStackTrace();
        
        SwingUtilities.invokeLater(new Runnable() 

            @Override
            public void run() 
                HTMLDocument doc = (HTMLDocument) jta.getStyledDocument();
                try 
                    doc.insertAfterEnd(doc.getCharacterElement(doc.getLength()), buildSomething1.toString());
                 catch (BadLocationException ex) 
                    Logger.getLogger(MyTextPane.class.getName()).log(Level.SEVERE, null, ex);
                 catch (IOException ex) 
                    Logger.getLogger(MyTextPane.class.getName()).log(Level.SEVERE, null, ex);
                
            
        );
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 

            @Override
            public void run() 
                MyTextPane fs = new MyTextPane();
            
        );
    

【讨论】:

以上是关于将 JTextPane 设置为内容类型 HTML 并使用字符串构建器的主要内容,如果未能解决你的问题,请参考以下文章

将 JTextPane 内容(图像、表格)保存在文件中

JTextPane - 内容在哪里?

在 JScrollPane 上设置滚动条

如何在 JTextPane 中为文本和下划线设置不同的颜色?

来自 jTextPane 的可点击文本

如何将 HTML 字符串读入 JEditorPane/JTextPane?