本文目录导读:

看起来您遇到了关于 JEditorPane、HTMLEditorKit 和解析器方法(Parser Method)被关闭或无法使用选择器(Selector)的问题,这通常与 Swing 的 HTML 渲染组件在处理某些 HTML/CSS 选择器时有关。
可能的原因和解决方案
HTMLEditorKit 默认解析器限制
JEditorPane 默认使用 HTMLEditorKit,但它支持的 HTML/CSS 功能有限,不支持复杂的选择器。
// 问题示例
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setText("<html><body><div class='myClass'>内容</div></body></html>");
// 试图通过选择器访问元素可能会失败
使用 HTMLEditorKit 的解析器
如果确实需要使用解析器,可以这样操作:
import javax.swing.text.html.*; import javax.swing.text.*; // 获取 HTML 文档 HTMLDocument doc = (HTMLDocument) editorPane.getDocument(); // 使用解析器 HTMLEditorKit.Parser parser = new HTMLEditorKit().getParser(); // 但这个方法在较新版本的 Java 中可能已被关闭或限制
替代方案:使用 JSoup(推荐)
对于复杂的 HTML 解析和选择器操作,建议使用专门的 HTML 解析库:
// 需要添加 jsoup 依赖
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
// 从 JEditorPane 获取 HTML 内容
String html = editorPane.getText();
Document doc = Jsoup.parse(html);
// 使用 CSS 选择器
Elements elements = doc.select(".myClass"); // 类选择器
Elements divs = doc.select("div"); // 标签选择器
Elements byId = doc.select("#myId"); // ID 选择器
Maven 依赖(如果使用 JSoup)
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
手动解析 HTML 选择器(简单场景)
如果只是简单的标签或属性匹配:
HTMLDocument doc = (HTMLDocument) editorPane.getDocument();
ElementIterator iterator = new ElementIterator(doc);
javax.swing.text.Element element;
while ((element = iterator.next()) != null) {
AttributeSet attrs = element.getAttributes();
String name = element.getName();
// 根据名称或属性筛选
if ("div".equals(name)) {
// 处理 div 元素
}
}
建议的解决步骤
- 检查 Java 版本:某些 Java 版本可能限制了对内部解析器的访问
- 评估需求:如果需要复杂选择器,使用 JSoup
- 简单场景:使用
ElementIteratorAPI - 升级组件:考虑使用 JavaFX 的 WebView 替代 JEditorPane
示例代码:使用 JSoup 处理 JEditorPane 内容
// 1. 获取 HTML 内容
String htmlContent = editorPane.getText();
// 2. 使用 JSoup 解析
Document doc = Jsoup.parse(htmlContent);
// 3. 使用选择器
Elements links = doc.select("a[href]");
for (Element link : links) {
System.out.println("链接: " + link.attr("href"));
}
// 4. 修改后写回(如果需要)
Elements divs = doc.select("div.content");
for (Element div : divs) {
div.text("新内容");
}
editorPane.setText(doc.html()); // 更新显示
如果您能提供更具体的错误信息或代码示例,我可以给出更针对性的解决方案。