【问题标题】:JTextPane does not render span tag correctlyJTextPane 无法正确呈现跨度标记
【发布时间】:2015-01-24 14:31:51
【问题描述】:

我有一些代码:

package main;

import java.awt.EventQueue;
import java.awt.Font;
import java.io.StringWriter;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DefaultCaret;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

public class LogConsole extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextPane logPane;
    private HTMLDocument logDoc;
    private HTMLEditorKit logKit;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LogConsole test = new LogConsole();
                    test.setVisible(true);

                    test.log("<span>Hello 1</span><br/>"); //Test 1
                    test.log("<span>Hello 2</span><br/>"); //Test 2
                    test.log("<span>Hello 3</span><br/>"); //Test 3

                    test.log("<span>Hello </span>");       //Test 4
                    test.log("<span>world!</span>");       //Test 5

                    test.printHTML();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Log some data...
     * @param str
     */
    public void log(String s){
        s = s.replaceAll("\n", "<br/>");
        try {
            logKit.insertHTML(logDoc, logDoc.getLength(), s, 0, 0, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void printHTML(){
        try{
            StringWriter writer = new StringWriter();
            logKit.write(writer, logDoc, 0, logDoc.getLength());
            String s = writer.toString();
            System.out.println(s);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void clearLog(){
        try {
            logPane.setText("");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the frame.
     */
    public LogConsole() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JScrollPane scrollPane = new JScrollPane();
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 404, Short.MAX_VALUE)
                    .addContainerGap())
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 229, Short.MAX_VALUE)
                    .addContainerGap())
        );

        logPane = new JTextPane();
        logPane.setContentType("text/html");
        logPane.setEditable(false);
        scrollPane.setViewportView(logPane);
        contentPane.setLayout(gl_contentPane);

        DefaultCaret caret = (DefaultCaret)logPane.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        logDoc = (HTMLDocument) logPane.getDocument();
        logKit = (HTMLEditorKit) logPane.getEditorKit();
        Font font = new Font("Consolas", Font.PLAIN, 14);
        String bodyRule = String.format("body{font-family:%s;font-size:%spt", 
                font.getFamily(), font.getSize());
        StyleSheet style = logDoc.getStyleSheet();
        style.addRule(bodyRule);
    }
}


我想将一些数据从我的应用程序记录到 JTextPane,但我遇到了一些问题。
首先,当我在两个log() 语句上添加两个跨度标签时,它会在它之间放置一个新行(参见 Test4 - Test5)。
所以我认为 JTextPane 不支持内联标签,所有标签都是块标签。
没关系,因为每一行的每个数据日志都非常'好空闲',
你不需要在每个数据日志上添加“
”,但我更喜欢自己处理

如果我在每个日志数据(测试 1、2、3)处插入 3 个带有“
”的 log() 语句,
第 1 行写“Hello 1”和一个新行,再一个新行。
第 2 行写“Hello 2”和一个新行
第 3 行写“Hello 3”和一个新行
但是Test1和Test 2的语句形式相同,产生两种不同的方式,为什么?
如果我将测试 2 更改为:

test.log("<span>Hello 2</span>"); //Test 2

它不会改变结果!!!
任何人都可以为我解释这些问题吗?
以及如何解决这些问题。
谢谢

【问题讨论】:

    标签: java html swing text


    【解决方案1】:

    问题不是插入 span,而是您使用 insertHTML() 创建了一种环绕的段落元素。

    调用工作正常,不会创建 2 行

    test.log("<span>Hello </span><span>World</span>");
    

    试试这个

    public void log(String s){
        s = s.replaceAll("\n", "<br/>");
        try {
    //            logKit.insertHTML(logDoc, logDoc.getLength(), s, 0, 0, null);
            logDoc.insertAfterEnd(logDoc.getCharacterElement(logDoc.getLength()), s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 我来晚了,现在我更喜欢logDoc.getCharacterElement(...)
    【解决方案2】:

    如果我理解这个问题...如果使用 HTMLDocument#insertBeforeEnd(...) 而不是 HTMLEditorKit#insertHTML(...) 会容易得多:

    logPane = new JTextPane();
    logPane.setContentType("text/html");
    logPane.setEditable(false);
    //http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6700731
    //Bug ID: JDK-6700731
    //JTextPane now renders HTML paragraph tags differently in/out of tables
    //logPane.setText("<html><table><tr><td><p id='log'>");
    logPane.setText("<html><p id='log' style='margin-top:0'>");
    
    //logKit.insertHTML(logDoc, logDoc.getLength(), s, 0, 0, null);
    logDoc.insertBeforeEnd(logDoc.getElement("log"), s);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2013-06-13
      相关资源
      最近更新 更多