Java Swing JEditorPane 不输出空段落

Java Swing JEditorPane not outputting empty paragraphs

将 HTML 插入 JEditorPane 后,如果有空段落元素,我将无法读回 HTML。这对我的项目很重要,因为我将它用作 html 编辑器,用户可以在其中创建新段落,但如果他们不在段落中输入任何内容,它们将在下一个 editor.getText 时被删除(),这让用户感到困惑。

如果我在编辑器窗格上调用 .getText() 而不做任何更改,加载编辑器窗格后,它具有以下 HTML 结构:

<html>
    <head>

    </head>
    <body>
        <p style="margin-top: 0">
  
        </p>
    </body>
</html>

但是如果我只是调用

editor.setText(editor.getText())
System.out.println(editor.getText())

输出变为

<html>
    <head>

    </head>
    <body>
    </body>
</html>

我需要能够获取 HTML,用 JSoup 修改它,然后重新插入它。理想情况下,调用 getText() 时我不会有任何损失。我尝试使用 HTMLDocument:

读取 HTML
        StringWriter writer = new StringWriter();    
        try {
            htmlKit_.write(writer,  htmlDoc_, 0, htmlDoc_.getLength());
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }
        String s = writer.toString();
        System.out.println(s);

但它给了我相同的结果。有什么办法可以保留这些空标签?我还需要保留空列表标签、空 table 标签等。这是我的代码。感谢您的帮助

测试人员:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import java.io.*;
import javax.swing.text.*;

public class TestEditor implements ActionListener {

    JButton printHTMLButton_;
    JEditorPane editor_;
    HTMLEditorKit htmlKit_;
    HTMLDocument htmlDoc_;
    
    public TestEditor() {
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600,600);     
        JPanel panel = new JPanel();
        frame.getContentPane().add(panel);
        panel.setBackground(Color.red);
    
        printHTMLButton_ = new JButton("HTML");
        printHTMLButton_.addActionListener(this);
        panel.add(printHTMLButton_);
        
        editor_ = new JEditorPane("text/html", "");
        editor_.setEditable(true);
        editor_.setPreferredSize(new Dimension(500, 500));
        panel.add(editor_);
        
        htmlKit_ = new HTMLEditorKit();
        editor_.setEditorKit(htmlKit_);
        
        htmlDoc_ = (HTMLDocument)editor_.getDocument();
        
        frame.setVisible(true); 
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == printHTMLButton_) {
            System.out.println(editor_.getText());
            editor_.setText(editor_.getText());
            System.out.println(editor_.getText());


            StringWriter writer = new StringWriter();    
            try {
                htmlKit_.write(writer,  htmlDoc_, 0, htmlDoc_.getLength());
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (BadLocationException e1) {
                e1.printStackTrace();
            }
            String s = writer.toString();
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        new TestEditor();
    }
}
htmlKit_.write(writer,  htmlDoc_, 0, htmlDoc_.getLength());

昨晚,对于你之前的问题,我正在使用上面的语句来尝试只为你的段落获取 HTML(因此粗体标记也会包括在内)。但是,无论我为 start/length 传递什么参数,我总是得到整个文档。

今天玩了长度:

//htmlKit_.write(writer,  htmlDoc_, 0, htmlDoc_.getLength());
System.out.println(htmlDoc_.getLength());
htmlKit_.write(writer,  htmlDoc_, 0, 2);

神奇的是,段落标签现在包含在输出中。

编辑器包的write(...)方法明显有问题