用于可滚动窗格的纯 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

用于 BigQuery UDF 的纯 javascript HTML 解析器

为画布设置滚动窗格的问题

拆分窗格、滚动窗格和布局如何工作

Spyder IDE中的SQL Server资源管理器窗格

在查看器窗格中打开 R Markdown