用于可滚动窗格的纯 Java HTML 查看器/渲染器 [关闭]
Posted
技术标签:
【中文标题】用于可滚动窗格的纯 Java HTML 查看器/渲染器 [关闭]【英文标题】:Pure Java HTML viewer/renderer for use in a Scrollable pane [closed] 【发布时间】:2011-01-27 03:33:53 【问题描述】:有哪些纯 Java html 查看器和渲染器可用?要求是:
它应该实现JComponent
接口以放置到Scrollable
窗格中。
最好是游离溶液;开源是加分项。
它作为 Maven 工件的可用性是一个优点。
我只知道一些组件和项目,其中一些现在已经失效:
内置JEditorPane
,支持HTML 3.2(从Java 1.4开始)
DJ Project(纯Java?)
Ekit by hexidec(基于javax.swing.text.html.HTMLEditorKit
)
JSyndrome HTML Editor by Sferyx
JWebPane
(有没有发布过)?
JDIC(已废弃;从一些信息 here 我看到它是原生的)
(PDF 渲染器)WebRenderer(原XHTMLRenderer)
【问题讨论】:
【参考方案1】:从Java 8开始,可以使用JavaFX的WebView Component,也可以是used in Swing。
代码很简单:
JFXPanel jfxPanel = new JFXPanel(); // Scrollable JCompenent
Platform.runLater( () -> // FX components need to be managed by JavaFX
WebView webView = new WebView();
webView.getEngine().loadContent( "<html> Hello World!" );
webView.getEngine().load( "http://www.***.com/" );
jfxPanel.setScene( new Scene( webView ) );
);
它由 WebKit 引擎提供支持(版本取决于 JRE,并且是最新的)。 但请记住,它不是一个完整的浏览器,所以不要指望支持 HTML5 音频/视频。 否则,它运行 HTML + CSS + JS 和你的浏览器一样好。
从技术上讲,底层引擎是 C++,而不是原生 Java。 但它捆绑在 Oracle 的官方 JRE 中,不需要库,零配置,与 Java FX 一样跨平台,并且正在积极更新和维护。
我认为在大多数用例中与原生 Java 一样好?
下面的信息已经过时了,看到我们现在有 Java 中的 WebView。
试过Cobra/Lobo、CSSBox和Flying Saucer,都是纯Java。其他的要么是原生的,要么是商业的。
内容:动态生成的简单 HTML(作为字符串),嵌入式 CSS 2.1,无 JS。
简短的故事:飞碟使用起来最简单,渲染最正确,但您最好完全控制内容。否则寻找原生解决方案。
长篇大论:
CSSBox 似乎更活跃,但它似乎依赖于一些第三方库。例如,演示依赖于使用 apache xerces 的 nekohtml,它改变了默认 Java 1.7 sax 解析器的工作方式并破坏了我的程序,但是当我强制它使用 java 的内置 xerces 时,我得到了ClassCastException (InlineBox to BlockBox)
。最后不能让它工作。另外还没有找到替换现有BrowserCanvas
中的文档的方法。
Cobra 不再维护,必须手动修复 incompatibility issue 才能使其在 1.7 中工作。还需要抓取 mozilla Rhino(不使用任何 JS)但仅此而已。之后就比较顺利了,只需要让 Logger 隐藏绘制消息即可。渲染是正确的,速度是公平的——只要文档简单。当您开始使用不太常见的标签或更复杂的布局时,Cobra 很快就会崩溃。
截至撰写本文时(2011 年 2 月),飞碟拥有三者中最好的 CSS 支持。设置非常简单(例如,不需要像 cobo 或像 cssbox 这样的 domparser 那样设置文档)几乎没有依赖 - 这也意味着没有 javascript。但是飞碟对你喂它的东西非常严格。源必须是格式良好的 XML,例如样式和脚本可能必须包装在 CDATA 中,如果您使用 html 实体,则必须声明 DTD(因此没有 html5 文档类型)。但是,如果您要嵌入您可以控制的内容,那么它可能是您的最佳选择。
【讨论】:
感谢您分享您的经验。几年过去了,据我所知,没有明显的改进/变化:) @dma_k:Cobra 最终让我失望了,但我可以找到一个更好的替代品,称为 Flying Saucer,最后一次更新是 2011 年 2 月。最初托管在 java.net 上,它似乎既更新又更容易然后使用 Cobra 和 CSSBox。所以也许毕竟有一些改进。 CSSBox 在 Java 7 上为我工作,所以看起来 XML 解析器问题已经解决了 我发现 JavaFX WebView 很慢。是否有任何新的解决方案? @gagarwal CSSBox 仍在增长,但它应该很难成为最好的 WebView(原生 WebKit)。我的经验是 WebView 会减慢 JS 启动速度并限制(不是?)并行连接。对于 JS,JIT 热身后的速度非常好;我们无能为力。对于连接,WebView 占用了很多资源的页面,当我使用主机文件阻止无关的第 3 方时,它会加快速度。使 Java 保持最新也有帮助。如果您提出一个新问题(具体问题),SO 社区可能会为您提供更好的帮助。【参考方案2】:如果您使用的是 Swing,则可以嵌入 JavaFX WebView。
1)应实现JComponent接口放入Scrollable窗格。
为了将 WebView 添加到 Swing,您需要将其添加到 JFXPanel,它是一个 JComponent。 为了使 WebView 填充完整的 JFXPanel,我使用了 AnchorPane,如下所示:
final AnchorPane anchorPane = new AnchorPane();
WebView webBrowser = new WebView();
//Set Layout Constraint
AnchorPane.setTopAnchor(webBrowser, 0.0);
AnchorPane.setBottomAnchor(webBrowser, 0.0);
AnchorPane.setLeftAnchor(webBrowser, 0.0);
AnchorPane.setRightAnchor(webBrowser, 0.0);
//Add WebView to AnchorPane
anchorPane.getChildren().add(webBrowser);
//Create Scene
final Scene scene = new Scene(anchorPane);
// Obtain the webEngine to navigate
final WebEngine webEngine = webBrowser.getEngine();
webEngine.load("http://www.google.com");
_jfxPanel.setScene(scene);
每当您运行 JavaFX 代码时,请确保在 Platform.runLater() 中运行它。
2) 最好是免费的解决方案;开源是一个加分项。
嗯,它是纯 Oracle java。
3) 作为 maven 工件的可用性是一个优势。
有关集成 JavaFX 和 Maven 的建议,请参阅 *** 答案 Maven project with JavaFX (with jar file in `lib`)。
从 Java8 开始,JavaFX 将完全集成到 Java 中。
其他优点: - 支持 HTML5 和 JavaScript(使用 webkit) - 支持平台互操作性 - 甚至支持与 DOM 交互、运行 JavaScript、从 Webview 获取事件通知。
缺点: -JavaFX 需要安装。但自 v7u6(2012 年 8 月)以来,它与 java 捆绑在一起。
其他体验:
我尝试了djproject,但在平台互操作性方面遇到了很多问题。在 Windows 上运行良好,但仅在 Linux 上付出了很大的努力,我无法让它在 Mac 上运行。对于每个平台,您还需要构建 32 位和 64 位版本的 jar。通过大量的努力和一个巨大的 jar 文件,您可以将所有内容合并到一个 jar 中。但这远非方便。
与我上面提到的 JavaFX 解决方案相比,DJProject 的痛苦更大。
【讨论】:
【参考方案3】:CSSBox 可能就是您要找的东西:http://cssbox.sourceforge.net
【讨论】:
【参考方案4】:查看这篇文章:http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java
它使用 JEditorPane 和其他一些 Swing 类来解析和渲染 HTML 和 CSS。
【讨论】:
@Sean:感谢您的回答,使用JEditorPane
很清楚。我需要替代品。【参考方案5】:
您还可以通过以下方式访问本机浏览器: http://djproject.sourceforge.net/ns/
对于某些网页,这有时是唯一的方法。总会有取舍。
我还没有找到一个渲染良好、开源且同时足够灵活的浏览器组件。 Cobra 接近了,但有些页面不会呈现,而且很难(不可能?)做一些事情,比如摆脱自己的滚动条等。
【讨论】:
【参考方案6】:哇 haferblues,我从没想过我会找到我喜欢 JavaFX 的东西。但是浏览器的实现真的很好。对于那些(像我一样)在此之前从未使用过 JavaFx 的人(对于 haferblues 的 sn-p):
import com.sun.javafx.application.PlatformImpl;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class SwingBrowser extends JFXPanel
private static final long serialVersionUID = 1L;
public SwingBrowser(String url)
PlatformImpl.startup(new Runnable()
@Override
public void run()
final AnchorPane anchorPane = new AnchorPane();
WebView webBrowser = new WebView();
// Set Layout Constraint
AnchorPane.setTopAnchor(webBrowser, 0.0);
AnchorPane.setBottomAnchor(webBrowser, 0.0);
AnchorPane.setLeftAnchor(webBrowser, 0.0);
AnchorPane.setRightAnchor(webBrowser, 0.0);
// Add WebView to AnchorPane
anchorPane.getChildren().add(webBrowser);
// Create Scene
final Scene scene = new Scene(anchorPane);
// Obtain the webEngine to navigate
final WebEngine webEngine = webBrowser.getEngine();
webEngine.load(url);
setScene(scene);
);
【讨论】:
我得到:线程“AppKit 线程”java.lang.NullPointerException 中的异常【参考方案7】:飞碟做得不错,但下面的渲染文本示例对我在 Linux Java 上的移动应用程序开发来说是一个巨大的障碍:
Sometimes the period at the end changes line without the text beside
.
此外,与 JTextPanel 不同,文本不可选择。
解析器似乎只接受 UTF-8 编码。解析时我无法强制自己编码。
【讨论】:
最新版本在 Breaker.java 飞碟类中修复了这个问题,请尝试 github 上最新的飞碟项目以上是关于用于可滚动窗格的纯 Java HTML 查看器/渲染器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
jscrollpane java_Java JScrollPane