本文目录导读:

我来帮你解析 JEditorPane、HTMLEditorKit、Parser 和 Token 这几个概念及其关系。
概念解释
JEditorPane
- Swing 组件,用于显示和编辑多种文本格式
- 支持 HTML、RTF 和纯文本
- 通过
EditorKit决定如何解析和渲染
HTMLEditorKit
- 继承自
StyledEditorKit - 负责处理 HTML 格式的解析和显示
- 包含一个
HTMLDocument和ViewFactory
Parser(解析器)
- 用于解析 HTML 内容
- 将 HTML 文本转换为 Token 序列
Token(令牌)
- 解析过程中的基本单位
- 表示 HTML 的结构元素
典型代码示例
import javax.swing.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.io.*;
public class HTMLParserExample {
public static void main(String[] args) {
JEditorPane editorPane = new JEditorPane();
HTMLEditorKit kit = new HTMLEditorKit();
editorPane.setEditorKit(kit);
// 设置 HTML 内容
String html = "<html><body><h1>Title</h1><p>Content</p></body></html>";
editorPane.setText(html);
}
}
解析过程
// 使用 HTMLEditorKit.Parser 进行解析
HTMLEditorKit.Parser parser = new HTMLEditorKit.Parser() {
@Override
public void parse(Reader r, HTMLEditorKit.ParserCallback cb, boolean ignoreCharSet) throws IOException {
// 解析逻辑
}
};
// 实现 ParserCallback 处理 Token
HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
@Override
public void handleText(char[] data, int pos) {
// 处理文本 Token
System.out.println("Text: " + new String(data));
}
@Override
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// 处理开始标签 Token
System.out.println("Start Tag: " + t);
}
@Override
public void handleEndTag(HTML.Tag t, int pos) {
// 处理结束标签 Token
System.out.println("End Tag: " + t);
}
@Override
public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// 处理自闭合标签 Token,如 <br>
System.out.println("Simple Tag: " + t);
}
};
Token 类型示例
// HTML Token 示例 HTML.Tag tag = HTML.Tag.H1; // <h1> HTML.Tag tag2 = HTML.Tag.P; // <p> HTML.Tag tag3 = HTML.Tag.BR; // <br> // 属性 Token SimpleAttributeSet attrs = new SimpleAttributeSet(); attrs.addAttribute(HTML.Attribute.CLASS, "myClass"); attrs.addAttribute(HTML.Attribute.ID, "myId"); // Token 序列 // <div class="container"> // <p>Hello World</p> // </div> // 对应的 Token: // 1. StartTag: <div> (属性: class="container") // 2. StartTag: <p> // 3. Text: "Hello World" // 4. EndTag: </p> // 5. EndTag: </div>
实际应用示例
public class HTMLTokenProcessor {
public static void main(String[] args) {
String html = "<html><body>" +
"<h1>Welcome</h1>" +
"<p>This is a <b>paragraph</b> with formatting</p>" +
"<img src='image.jpg'>" +
"</body></html>";
JEditorPane editor = new JEditorPane("text/html", html);
HTMLEditorKit kit = (HTMLEditorKit) editor.getEditorKit();
HTMLDocument doc = (HTMLDocument) editor.getDocument();
// 遍历文档中的 Token
try {
// 使用 ElementIterator 遍历元素
ElementIterator iterator = new ElementIterator(doc);
Element element;
while ((element = iterator.next()) != null) {
AttributeSet attrs = element.getAttributes();
Object name = attrs.getAttribute(StyleConstants.NameAttribute);
if (name instanceof HTML.Tag) {
HTML.Tag tag = (HTML.Tag) name;
System.out.println("发现标签: " + tag);
// 处理属性
if (attrs.containsAttribute(HTML.Attribute.CLASS, "myClass")) {
// 处理特定类
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 解析流程: HTML → Parser → Token序列 → HTMLDocument → 渲染
- Token类型: StartTag, EndTag, SimpleTag, Text, Comment 等
- 回调机制: ParserCallback 接口处理 Token
- 属性处理: 使用 AttributeSet 管理标签属性
- 性能考虑: 大文档时可考虑分批处理
这个体系提供了强大的 HTML 解析和渲染能力,但要注意 Swing 的线程安全问题,所有操作应在 EDT(Event Dispatch Thread)中进行。