本文目录导读:

看起来你遇到了与 JEditorPane、HTMLEditorKit 以及解析器相关的错误,具体错误信息是 “非法选择器” 或 “Illegal Selector”,这通常与 HTML 解析 或 CSS 样式解析 有关,尤其是在 Java Swing 的 JEditorPane 中加载 HTML 内容时。
以下是可能的原因及解决方案:
常见原因
- CSS 选择器语法错误:
HTMLEditorKit默认使用较旧的解析器(如ParserDelegator或不支持现代 CSS 选择器)。 - HTML 标签/属性不规范:某些 HTML 标签或属性在当前
HTMLEditorKit版本中不被支持。 - 自定义字符编码问题:HTML 内容包含非法字符或特殊符号。
- 不正确的 MIME 类型:
JEditorPane设置了错误的contentType(如text/plain而非text/html)。
解决方案
✅ 正确设置内容类型
确保在设置 HTML 内容前,先 setContentType("text/html"):
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setText("<html><body>Hello</body></html>");
✅ 使用兼容的 HTML 解析器
- 默认
HTMLEditorKit支持 HTML 3.2 / 4.01,不支持 HTML5 或复杂 CSS。 - 如果必须使用 CSS,参考以下方案:
- 使用 JEditorPane + HTMLEditorKit + CSS 时,CSS 应写在
<style>标签中,并使用简单的选择器(如p { color: red; }),避免复杂选择器(如nth-child、class嵌套)。 - 示例:
String html = "<html><head><style>p { color: blue; }</style></head><body><p>Text</p></body></html>"; editor.setText(html);
- 使用 JEditorPane + HTMLEditorKit + CSS 时,CSS 应写在
✅ 避免非标准 HTML/CSS
- 移除 HTML5 标签(如
<header>,<section>)。 - 移除 CSS3 高级选择器(如
hover,focus,nth-child,>子选择器)。 - 移除 JavaScript /
<script>标签(JEditorPane不执行脚本,但可能影响解析)。
✅ 处理“非法选择器”错误
如果错误直接是 Exception 形式(如 javax.swing.text.html.parser.ParserDelegator 抛出异常),可以 捕获并忽略,或 使用更宽松的解析器。
简易处理:捕获异常并重新设置纯文本
try {
editor.setText(htmlContent);
} catch (Exception e) {
// 回退到纯文本
editor.setContentType("text/plain");
editor.setText("HTML parse error: " + e.getMessage());
}
更专业的替代方案(推荐)
HTML/CSS 内容较复杂(如需要现代 CSS、HTML5),JEditorPane 能力非常有限,建议改用:
| 库 / 组件 | 说明 |
|---|---|
JavaFX WebView (javafx.scene.web.WebView) |
基于 WebKit,支持完整的 HTML5 / CSS3 / JavaScript。 |
| JxBrowser (商业) | 基于 Chromium,功能强大但收费。 |
Swing-Browser (如 DJ Native Swing) |
嵌入本地浏览器控件,但维护已停止。 |
使用 JavaFX WebView 示例:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
// 在 Swing 中使用 JavaFX
JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(() -> {
WebView webView = new WebView();
webView.getEngine().loadContent("<html><body><p style='color:red'>Hello</p></body></html>");
jfxPanel.setScene(new Scene(webView));
});
- 错误原因:HTML/CSS 解析器遇到不支持的语法。
- 快速解决:简化 HTML/CSS,只使用基础标签和属性。
- 最佳实践:复杂页面使用 JavaFX WebView 替换
JEditorPane。
如果你能提供具触发错误的 HTML 代码片段,我可以帮你精确找出问题所在。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播