JEditorPaneHTMLEditorKitParserTrim修剪操作

wen java案例 1

本文目录导读:

JEditorPaneHTMLEditorKitParserTrim修剪操作

  1. 自动修剪HTML中的空白字符
  2. 通过DocumentFilter修剪输入
  3. 获取纯文本时修剪
  4. 设置内容时自动修剪
  5. 使用自定义HTMLEditorKit
  6. 注意事项

在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());

注意事项

  1. 性能影响:HTML解析和修剪可能影响性能,大量内容时需考虑
  2. 语义保留:直接trim()可能破坏HTML结构(如<p> text </p>内的空格)
  3. 更好的做法:使用DOM解析器(如Jsoup)进行精确修剪
  4. 编码问题:确保Reader/Writer使用正确的编码

选择哪种方法取决于你的具体需求:

  • 显示需求:使用自定义Parser或EditorKit
  • 编辑需求:使用DocumentFilter
  • 文本提取:使用ParserCallback模式

抱歉,评论功能暂时关闭!