用于“可滚动”窗格的纯Java HTML查看器/渲染器
什么纯Java的HTML查看器和渲染器可用? 要求是:
- 它应该实现
JComponent
接口放置在Scrollable
窗格中。 - 它应该是一个免费的解决scheme; 开源是一个优点。
- 它作为Maven工件的可用性是一个加号。
我只知道一些组件和项目,其中一些已经失效:
- 内置
JEditorPane
,支持HTML 3.2(从Java 1.4开始) - DJ项目 (这是纯Java?)
- Eide by hexidec (基于
javax.swing.text.html.HTMLEditorKit
) - 由JSferyx JSyndrome HTML编辑器
-
JWebPane
(是否曾经发布过)? - JDIC(遗弃;从这里的一些信息,我看到它是本地的)
- (PDF渲染器) WebRenderer (前XHTMLRenderer )
从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并且是相当新的)。 但请记住,它不是一个完整的浏览器,所以不要指望支持HTML5audio/video。 否则,它运行HTML + CSS + JS和浏览器一样好。
从技术上讲,底层引擎是C ++,而不是本地Java。 但是它捆绑在Oracle的官方JRE中,不需要库,具有零configuration,与Java FX一样是跨平台的,并且正在被主动更新和维护。
对于大多数使用情况来说,和原生Java一样好,我想呢?
下面的信息是过时的,看到我们现在有Java中的WebView。
试过Cobra / Lobo , CSSBox和Flying Saucer ,都是纯Java的。 其他人是本地或商业。
内容:dynamic生成简单的HTML(如string),embedded式CSS 2.1,无JS。
简短的故事:飞碟最简单的使用和渲染是最正确的,但你最好有完全控制内容。 否则,寻找一个本地解决scheme。
很长的故事:
CSSBox似乎更活跃,但它似乎取决于一些第三方库。 例如,演示取决于nekohtml,它使用apache xerces,它改变了默认的Java 1.7萨克斯parsing器的工作方式,并打破了我的程序,但是当我强制它使用内置的xerces的java时,我得到了ClassCastException (InlineBox to BlockBox)
。 最后不能得到它的工作。 另外还没有find一种方法来replace现有BrowserCanvas
的文档。
眼镜蛇不再维护,必须手动修复不兼容问题才能在1.7版本中工作。 还需要抓住mozilla犀牛(不使用任何JS),但是这一切。 之后,它相当顺利,只需要问Logger隐藏油漆消息。 渲染是正确的,速度是公平的 – 只要文件很简单。 当你开始使用较不常见的标签或更复杂的布局时,眼镜蛇很快就会分崩离析。
飞碟有写作(2011年2月)的三个最好的CSS支持。 安装非常简单(例如,不需要设置像cobo这样的文件或像cssbox这样的domparser)几乎没有依赖性 – 这也意味着没有JavaScript。 但飞碟是非常严格的,你喂它。 源代码必须是格式良好的XML,例如样式和脚本可能必须包装在CDATA中,如果使用html实体,则必须声明DTD(因此不包含html5文档types)。 但是,如果你embedded的内容,你可以控制,那么它可能是你最好的select。
如果您正在使用Swing,则可以embeddedJavaFX 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)应该是一个免费的解决scheme; 开源是一个加号。
那么,这是纯粹的Oracle Java。
3)作为maven artifact的可用性是一个加号。
请参阅StackOverflow回答JavaFX的Maven项目(在`lib`中有jar文件),以获得有关集成JavaFX和Maven的build议。
JavaFX上的Java8将完全集成到Java中。
更多优点: – 支持HTML5和JavaScript(使用webkit) – 支持平台互操作性 – 甚至支持与DOM交互,运行JavaScript,从Webview获取事件通知。
缺点:-JavaFX需要安装。 但自从v7u6(2012年8月)以来,它就与Java捆绑在了一起。
其他经验:
我试过djproject ,但是在平台互操作性方面有很多问题。 在Windows上工作得很好,但是只有在Linux上做了很多努力,我才能在Mac上工作。 对于每个平台,您还需要构build一个32位和64位版本的jar。 通过大量的努力和一个巨大的jar文件,你可以将所有的东西合并成一个jar文件。 但是这很不方便。
与上面提到的JavaFX解决scheme相比,DJProject是一个更大的痛苦。
您还可以通过如下方式访问本机浏览器: http : //djproject.sourceforge.net/ns/
对于某些网页,这有时是唯一的出路。 总是有折衷。
我还没有find一个浏览器组件,呈现良好,是开源的,同时有足够的灵活性。 眼镜蛇靠近了,但是有些页面不能渲染,而且很难(不可能?)去做它自己的滚动条等等。
CSSBox可能是你在找什么: http ://cssbox.sourceforge.net
看看这篇文章: http : //devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java
它使用JEditorPane和其他一些Swing类来parsing和渲染不仅HTML,而且CSS。
哇haferblues,我从来没有想过我会find我喜欢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); } }); } }
飞碟做的工作OK,但下面的文字示例是在Linux Java上我的移动应用程序开发巨大的closures:
Sometimes the period at the end changes line without the text beside .
此外,与JTextPanel不同,文本不可选。
parsing器似乎只接受UTF-8编码。 parsing时无法强制自己编码。