JEditorPaneHTMLEditorKitParserMethodSubscriber订阅者

wen java案例 1

本文目录导读:

JEditorPaneHTMLEditorKitParserMethodSubscriber订阅者

  1. 核心概念梳理
  2. 最可能的场景
  3. 关于“Method”和“Subscriber”的总结
  4. 关键点补充
  5. 如果您是想实现一个“基于解析器的订阅系统”

您提到的 JEditorPane、HTMLEditorKit、Parser、Method、Subscriber(订阅者) 这几个关键词组合起来,通常指向 Java Swing 中解析 HTML 时的底层回调机制,或者是一个 自定义的 HTML 内容抓取/解析框架 的设计。

在标准的 Java Swing API 中,javax.swing.text.html.HTMLEditorKitjavax.swing.text.html.parser.Parser(以及其内部的 Callback 接口)是核心,下面我为您拆解这其中的关系,并给出一个完整的示例。

核心概念梳理

  1. JEditorPane:Swing 的文本组件,可以显示 HTML。
  2. HTMLEditorKit:安装到 JEditorPane 上的编辑器工具包,负责加载和显示 HTML。
  3. Parser (HTMLEditorKit.Parser 或 javax.swing.text.html.parser.ParserDelegator):负责将 HTML 字符串解析成 DOM 节点。
  4. Callback (不是 Subscriber 而是 Callback):解析器在解析过程中遇到 HTML 标签时,会调用一个 HTMLEditorKit.ParserCallback 接口的方法。
  5. Subscriber(订阅者):这是您提到的词,在标准的 Java Swing 中,没有直接叫 Subscriber 的类,这通常是您自己设计的一个观察者模式中的订阅者,或者在解析过程中注册的监听器,在 RxJava 或 Reactive 编程中,Subscriber 才是标准术语。

最可能的场景

您可能是在描述以下两种情况之一:

使用 ParserCallback 作为“订阅者”

您重写 HTMLEditorKit.ParserCallback 的方法,当作“订阅”了 HTML 解析事件,解析器遇到 <p><a>、文本等,都会调用回调方法。

代码示例(标准的 Swing HTML 回调):

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import java.io.StringReader;
public class HtmlParserWithCallback {
    public static void main(String[] args) throws Exception {
        String htmlContent = "<html><body><h1>Hello</h1><p>World</p></body></html>";
        // 1. 创建一个解析器回调(相当于您的“订阅者”)
        HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleText(char[] data, int pos) {
                String text = new String(data);
                if (!text.trim().isEmpty()) {
                    System.out.println("[Text订阅者] 收到文本: " + text + " (位置: " + pos + ")");
                }
            }
            @Override
            public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                System.out.println("[Tag订阅者] 开始标签: <" + t + "> (位置: " + pos + ")");
            }
            @Override
            public void handleEndTag(HTML.Tag t, int pos) {
                System.out.println("[Tag订阅者] 结束标签: </" + t + "> (位置: " + pos + ")");
            }
            @Override
            public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                System.out.println("[Tag订阅者] 自闭合标签: <" + t + "/> (位置: " + pos + ")");
            }
        };
        // 2. 使用解析器,将回调传入(订阅关系建立)
        ParserDelegator parser = new ParserDelegator();
        parser.parse(new StringReader(htmlContent), callback, true);
    }
}

输出:

[Tag订阅者] 开始标签: <html> (位置: 0)
[Tag订阅者] 开始标签: <body> (位置: 0)
[Tag订阅者] 开始标签: <h1> (位置: 0)
[Text订阅者] 收到文本: Hello (位置: 0)
[Tag订阅者] 结束标签: </h1> (位置: 0)
[Tag订阅者] 开始标签: <p> (位置: 0)
[Text订阅者] 收到文本: World (位置: 0)
[Tag订阅者] 结束标签: </p> (位置: 0)
[Tag订阅者] 结束标签: </body> (位置: 0)
[Tag订阅者] 结束标签: </html> (位置: 0)

ParserCallback Swing 中原生的“订阅者”。

您自己实现了一个 Subscriber 接口作为观察者

如果您是在做一个爬虫或 HTML 内容提取框架,您可能会定义一个 Subscriber 接口,让 Parser 在解析到特定 Method(方法)或标签时通知它。

自定义接口示例:

// 订阅者接口 (观察者)
interface HtmlSubscriber {
    void onText(String text);
    void onLink(String href, String text);
    void onImage(String src);
}
// 解析器方法,接收订阅者
public class MyHtmlParserMethodSubscriber {
    public void parse(String html, HtmlSubscriber subscriber) {
        // 使用 ParserCallback 作为桥梁,将事件转发给自定义的 Subscriber
        HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                if (t == HTML.Tag.A) {
                    String href = (String) a.getAttribute(HTML.Attribute.HREF);
                    // 这里只是示例,实际需要存下来等到 handleText 时一起发送
                    // 更好的设计是用一个方法专门处理
                }
            }
            @Override
            public void handleText(char[] data, int pos) {
                subscriber.onText(new String(data));
            }
        };
    }
}

Method”和“Subscriber”的总结

在您提到的 JEditorPaneHTMLEditorKitParserMethodSubscriber 这个长词中:

  • Method:可能指的是 ParserCallback 中的各个回调方法handleText, handleStartTag...),或者您自定义的 Method 类。
  • Subscriber:就是订阅这些回调事件的对象。

关键点补充

  • 不要直接使用 javax.swing.text.html.parser.Parser:这个类是受保护的或包私有的,通常应该使用 ParserDelegator(一个公开的解析器代理)。
  • HTMLEditorKit 自带解析:如果您只是想显示 HTML,不需要手动解析。JEditorPane.setPage(url) 即可完成渲染。
  • 性能问题:Swing 的 HTML 解析器(ParserDelegator)是 Swing HTML 3.2 级别,不支持 CSS、JavaScript 或现代 HTML5,如果处理复杂文档,建议使用 Jsoup 等库。

如果您是想实现一个“基于解析器的订阅系统”

您可能会这样设计:

public class HtmlParserMethodSubscriber {
    // 注册不同的订阅者处理不同的方法
    private List<Subscriber> subscribers = new ArrayList<>();
    public void subscribe(Subscriber s) {
        subscribers.add(s);
    }
    public void parseAndNotify(String html) {
        ParserDelegator parser = new ParserDelegator();
        parser.parse(new StringReader(html), new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleText(char[] data, int pos) {
                for (Subscriber s : subscribers) {
                    s.onText(new String(data)); // 通知所有订阅者
                }
            }
        }, true);
    }
    // 订阅者接口
    interface Subscriber {
        void onText(String text);
        // ... 其他方法
    }
}

希望这个回答能准确解释您想知道的 JEditorPaneHTMLEditorKitParserMethodSubscriber 模式,如果您的具体场景不同,请提供更多上下文,我可以给出更精准的代码。

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