純粋なJava HTMLビューアーとレンダラーは利用可能ですか?要件は次のとおりです。
JComponent
ペインに配置される Scrollable
インターフェイスを実装する必要があります。私はいくつかのコンポーネントとプロジェクトのみを知っていますが、現在それらのいくつかは機能していません:
JEditorPane
、HTML 3.2をサポート(Java 1.4時点)javax.swing.text.html.HTMLEditorKit
に基づいています)JWebPane
(リリースされたことがありますか?)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ではありません。ただし、オラクルの公式JREにバンドルされており、ライブラリを必要とせず、構成がゼロで、Java FXと同じクロスプラットフォームであり、アクティブに更新および保守されます。
ネイティブと同じくらいJavaほとんどのユースケースで、私は思う?
以下の情報は古くなっており、JavaでWebViewが使用できるようになりました。
試した コブラ/ロボ 、 CSSBox 、および 空飛ぶ円盤 、すべて純粋なJava。その他は、ネイティブまたは商用です。
コンテンツ:オンザフライで生成される単純なHTML(文字列として)、埋め込みCSS 2.1、JSなし。
短編:Flying Saucerは最も簡単に使用でき、レンダリングは最も正確ですが、コンテンツを完全に制御できます。それ以外の場合は、ネイティブソリューションを探します。
長い話:
CSSBoxはよりアクティブに見えますが、いくつかのサードパーティライブラリに依存しているようです。たとえば、デモはApache xercesを使用するnekohtmlに依存しており、デフォルトのJava 1.7 saxパーサーが動作し、プログラムが壊れましたが、Javaの組み込みxercesを使用するように強制するとClassCastException (InlineBox to BlockBox)
。最後に機能させることはできませんが、既存のBrowserCanvas
内のドキュメントを置き換える方法はまだ見つかりません。
Cobraはもはやメンテナンスされていません。1.7で動作させるには、手動で 非互換性の問題 を修正する必要があります。また、Mozilla Rhino(JSを使用しない)を取得する必要がありますが、それだけです。その後はかなりスムーズになり、ペイントメッセージを非表示にするようロガーに依頼するだけです。ドキュメントが単純である限り、レンダリングは正しく、速度は公平です。あまり一般的ではないタグやより複雑なレイアウトを使用し始めると、Cobraはすぐにバラバラになります。
Flying Saucerは、執筆時点で3つのCSSサポートの中で最も優れています(2011年2月)。セットアップは非常に簡単です(たとえば、coboのようなドキュメントやcssboxのようなdomparserをセットアップする必要はありません)。しかし、空飛ぶ円盤は、あなたが餌を与えることに関して非常に厳格です。ソースは整形式のXMLである必要があります。たとえば、スタイルとスクリプトはCDATAでラップする必要があり、htmlエンティティを使用する場合はDTDを宣言する必要があります(html5 doctypeは使用しない)。ただし、制御可能なコンテンツを埋め込む場合は、それが最良の選択かもしれません。
Swingを使用している場合は、JavaFX WebViewを埋め込むことができます。
1)スクロール可能なペインに配置されるJComponentインターフェイスを実装する必要があります。
WebViewをSwingに追加するには、JComponentであるJFXPanelに追加する必要があります。 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アーティファクトとしての可用性はプラスです。
StackOverflowの回答 JavaFXを使用したMavenプロジェクト( `lib`のjarファイルを使用) を参照して、JavaFXとMavenの統合に関するアドバイスを確認してください。
Java8からJavaFXはJavaに完全に統合されます。
追加の長所:-HTML5およびJavaScriptをサポート(webkitを使用)-プラットフォームの相互運用性をサポート-DOMとの対話のサポート、JavaScriptの実行、Webviewからのイベント通知の取得。
短所:-JavaFXをインストールする必要があります。ただし、v7u6(2012年8月)以降Javaがバンドルされています。
その他の経験:
djproject を試しましたが、プラットフォームの相互運用性に多くの問題がありました。 Windowsで非常にうまく動作しましたが、Linuxで大きな努力をしただけで、Macで動作させることができませんでした。すべてのプラットフォームについて、32ビットおよび64ビットバージョンのjarも作成する必要があります。多大な労力と巨大なjarファイルを使用すると、すべてを1つのjarにマージできます。しかし、これは便利とはほど遠いものでした。
前述のJavaFXソリューションと比較すると、DJProjectは大きな苦痛でした。
次のような方法でネイティブブラウザにアクセスすることもできます。 http://djproject.sourceforge.net/ns/
特定のWebページでは、これが唯一の方法である場合があります。常にトレードオフがあります。
うまくレンダリングし、オープンソースであり、同時に十分に柔軟なブラウザコンポーネントをまだ見つけていません。コブラは近づきますが、レンダリングされないページがあり、独自のスクロールバーを削除するなどの操作を行うのは困難です(不可能ですか?)。
CSSBoxはあなたが探しているものかもしれません: http://cssbox.sourceforge.net
この記事をチェックしてください: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-Java
JEditorPaneおよびその他のSwingクラスを使用して、HTMLだけでなくCSSも解析およびレンダリングします。
うわー、haferblues、私はJavaFXについて好きなものを見つけるとは思わなかった。しかし、ブラウザの実装は本当に素晴らしいです。ここで完全なクラス(haferbluesのスニペット用)の前にJavaFxを使用したことがない(私のような)場合:
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);
}
});
}
}
フライングソーサーは問題なく動作していましたが、次のレンダリングされたテキストの例は、Linuxでのモバイルアプリ開発の大きな転換点でしたJava:
Sometimes the period at the end changes line without the text beside .
また、JTextPanelの場合とは異なり、テキストは選択できません。
パーサーはUTF-8エンコーディングのみを受け入れるようです。解析時に自分のエンコーディングを強制することができませんでした。