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(...)方法明显有问题
将 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(...)方法明显有问题