36

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

  • 它应该实现JComponent要放置到Scrollable窗格中的界面。
  • 最好是免费的解决方案;开源是一个加号。
  • 它作为 Maven 工件的可用性是一个加号。

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

4

7 回答 7

36

从 Java 8 开始,可以使用 JavaFX 的WebView 组件,也可以在 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 似乎更活跃,但它似乎依赖于一些 3rd 方库。例如,演示依赖于使用 apache xerces 的 nekohtml,它改变了默认 Java 1.7 sax 解析器的工作方式并破坏了我的程序,但是当我强制它使用 java 内置的 xerces 时,我得到了ClassCastException (InlineBox to BlockBox). 最后不能让它工作。Plus 仍然没有找到一种方法来替换现有 BrowserCanvas.

Cobra 不再维护,必须手动修复不兼容问题才能使其在 1.7 中运行。还需要抓取 mozilla Rhino(不使用任何 JS)但仅此而已。之后就比较顺利了,只需要让 Logger 隐藏绘制消息即可。渲染是正确的,速度是公平的——只要文档简单。当您开始使用不太常见的标签或更复杂的布局时,Cobra 很快就会崩溃。

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

于 2012-04-09T23:19:17.640 回答
10

如果您使用的是 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 和 Maven 的建议,请参阅 StackOverflow answer Maven project with JavaFX(在 `lib` 中带有 jar 文件)

从 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 是一个更大的痛苦。

于 2014-01-30T14:50:10.987 回答
3

CSSBox 可能是您正在寻找的:http ://cssbox.sourceforge.net

于 2011-12-09T21:16:27.987 回答
2

Check out this article: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java

It uses JEditorPane and some other Swing classes to parse and render not only HTML, but also CSS.

于 2010-03-13T12:41:17.720 回答
2

您还可以通过以下方式访问本机浏览器:http: //djproject.sourceforge.net/ns/

对于某些网页,这有时是唯一的方法。总会有取舍。

我还没有找到一个渲染良好、开源且同时足够灵活的浏览器组件。Cobra 接近了,但有些页面不会呈现,而且很难(不可能?)做一些事情,比如摆脱自己的滚动条等。

于 2010-03-14T18:27:54.040 回答
0

哇 haferblues,我从没想过我会找到我喜欢 JavaFX 的东西。但是浏览器的实现真的很好。对于那些(像我一样)在此之前从未使用过 JavaFx 的人来说,完整的类(对于 haferblues 的片段):

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);
            }
        });
    }
}
于 2015-09-10T11:26:20.353 回答
0

飞碟做得不错,但是下面的渲染文本示例对我在 Linux Java 上的移动应用程序开发来说是一个巨大的障碍:

Sometimes the period at the end changes line without the text beside .

此外,与 JTextPanel 不同,文本不可选择。

解析器似乎只接受 UTF-8 编码。解析时我无法强制自己编码。

于 2016-02-09T22:03:36.290 回答