本文目录导读:

在Java Swing中使用JEditorPane配合HTMLEditorKit时,修剪(Trim)操作”通常涉及HTML内容的空白处理或文本截断,以下是几种常见场景及解决方案:
自动修剪HTML中的空白字符
HTMLEditorKit默认会保留HTML中的空白,但有时需要手动修剪:
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.HTML;
// 自定义HTML解析器,在解析时修剪文本
public class TrimmingParser extends javax.swing.text.html.parser.Parser {
public TrimmingParser() {
super(DTD.getDTD("html32"));
}
@Override
protected void handleText(char[] text) {
String trimmed = new String(text).trim();
super.handleText(trimmed.toCharArray());
}
}
通过DocumentFilter修剪输入
当用户编辑HTML内容时,可以自动修剪:
import javax.swing.text.DocumentFilter;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
JEditorPane editor = new JEditorPane();
editor.setEditorKit(new HTMLEditorKit());
// 添加DocumentFilter
((AbstractDocument) editor.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr)
throws BadLocationException {
super.insertString(fb, offset, text.trim(), attr); // 修剪后插入
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
super.replace(fb, offset, length, text.trim(), attrs);
}
});
获取纯文本时修剪
从HTML中提取纯文本并修剪:
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;
import java.io.StringReader;
public static String extractTextWithTrim(String html) {
StringBuilder sb = new StringBuilder();
try {
HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
@Override
public void handleText(char[] data, int pos) {
sb.append(data).append(" ");
}
};
new ParserDelegator().parse(new StringReader(html), callback, true);
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString().trim(); // 最终修剪
}
时自动修剪
在设置HTML内容前进行预处理:
String htmlContent = " <p> Hello World </p> ";
// 正则修剪首尾空白标签
String trimmed = htmlContent.replaceAll("^(\\s*<[^>]*>\\s*)+", "")
.replaceAll("(\\s*<[^>]*>\\s*)+$", "")
.trim();
editor.setText(trimmed);
使用自定义HTMLEditorKit
创建自定义EditorKit覆盖解析行为:
public class TrimmingHTMLEditorKit extends HTMLEditorKit {
@Override
public void read(Reader in, Document doc, int pos) throws IOException, BadLocationException {
// 包装Reader进行修剪
BufferedReader br = new BufferedReader(in);
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line.trim()).append("\n");
}
super.read(new StringReader(sb.toString().trim()), doc, pos);
}
}
// 使用
editor.setEditorKit(new TrimmingHTMLEditorKit());
注意事项
- 性能影响:HTML解析和修剪可能影响性能,大量内容时需考虑
- 语义保留:直接
trim()可能破坏HTML结构(如<p> text </p>内的空格) - 更好的做法:使用DOM解析器(如Jsoup)进行精确修剪
- 编码问题:确保Reader/Writer使用正确的编码
选择哪种方法取决于你的具体需求:
- 显示需求:使用自定义Parser或EditorKit
- 编辑需求:使用DocumentFilter
- 文本提取:使用ParserCallback模式