纯 Java HTML 查看器/呈现器,用于可滚动窗格 [已关闭]

2022-09-01 05:16:15

有哪些纯 Java HTML 查看器和渲染器可用?要求是:

  • 它应该实现要放置在可滚动窗格中的 JComponent 接口。
  • 它应该最好是一个自由的解决方案;开源是一个加号。
  • 它作为Maven神器的可用性是一个加号。

我只知道一些组件和项目,其中一些现在已经不复存在:


答案 1

从Java 8开始,您可以使用JavaFX的WebView Component,它也可以在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.stackoverflow.com/" );
   jfxPanel.setScene( new Scene( webView ) );
});

它由WebKit引擎支持(版本取决于JRE,并且价格合理)。但请记住,它不是一个完整的浏览器,所以不要指望支持HTML5音频/视频。否则,它运行HTML + CSS + JS与您的浏览器一样好。

从技术上讲,底层引擎是C++的,而不是原生Java。但它捆绑在Oracle的官方JRE中,不需要库,没有配置,像Java FX一样跨平台,并且正在积极更新和维护。

对于大多数用例来说,与原生Java一样好,我想呢?


下面的信息已经过时了,因为我们现在有Java中的WebView。

尝试了Cobra / LoboCSSBoxFlying Saucer,都是纯Java。其他人要么是本地的,要么是商业的。

内容:动态生成的简单HTML(字符串),嵌入式CSS 2.1,无JS。

短篇故事:飞碟使用起来最简单,渲染也最正确,但你最好完全控制内容。否则,请查找本机解决方案。

说来话长:

CSSBox似乎更活跃,但它似乎依赖于一些第三方库。例如,演示依赖于使用apache xerces的nekohtml,它改变了默认Java 1.7 sax解析器的工作方式并破坏了我的程序,但是当我强制它使用java的内置xerces时,我得到了。最后无法让它工作。另外,仍然没有找到一种方法来替换现有中的文档。ClassCastException (InlineBox to BlockBox)BrowserCanvas

Cobra不再维护,必须手动修复不兼容问题才能使其在1.7中正常工作。还需要抓取Mozilla Rhino(不使用任何JS),但仅此而已。之后,它相当流畅,只需要要求Logger隐藏油漆消息。渲染是正确的,速度是公平的 - 只要文档是简单的。当你开始使用不太常见的标签或更复杂的布局时,眼镜蛇很快就会分崩离析。

Flying Saucer在撰写本文时拥有三者中最好的CSS支持(2011年2月)。设置非常简单(例如,不需要像cobo或domparser那样设置文档,如cssbox)几乎没有依赖性 - 这也意味着没有javascript。但是飞碟对你喂它的东西非常严格。源必须是格式正确的 XML,例如,样式和脚本可能必须包装在 CDATA 中,如果使用 html 实体,则必须声明 DTD(因此没有 html5 文档类型)。但是,如果您要嵌入可以控制的内容,那么它可能是您的最佳选择。


答案 2

如果您使用的是 Swing,则可以嵌入 JavaFX WebView。

1)应实现将JComponent接口放入可滚动窗格中。

为了将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的StackOverflow答案Maven项目(在“lib”中使用jar文件)以获取有关集成JavaFX和Maven的建议。

从Java8到JavaFX将完全集成到Java中。

Additonal Pros: -支持HTML5和JavaScript(使用webkit) -支持平台互操作性 -甚至支持与DOM交互,运行JavaScript,从Webview获得事件通知。

缺点: -需要安装JavaFX。但它自 v7u6(2012 年 8 月)起与 java 捆绑在一起。

其他经历:

我尝试了djproject,但在平台互操作性方面遇到了很多问题。在Windows上工作得很好,但只有在Linux上付出了很大的努力,我无法让它在Mac上工作。对于每个平台,您还需要构建32位和64位版本的jar。通过大量的努力和一个巨大的jar文件,您可以将所有内容合并到一个jar中。但这远非方便。

与我上面提到的JavaFX解决方案相比,DJProject是一个更大的痛苦。