36

Pure Java HTML ビューアとレンダラーには、どのようなものがありますか? 要件は次のとおりです。

  • ペインJComponentに配置するインターフェイスを実装する必要があります。Scrollable
  • それはできれば自由な解決策であるべきです。オープンソースはプラスです。
  • Maven アーティファクトとして利用できることはプラスです。

私が知っているコンポーネントとプロジェクトはほんのわずかで、そのうちのいくつかは現在機能していません。

4

7 に答える 7

36

Java 8 から、Swingでも使用できるJavaFX のWebView Componentを使用できるようになりました。

コードは次のように単純です。

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/Lobo、CSSBox 、およびFlying Saucerをすべて純粋な Javaで試しました。その他は、ネイティブまたは商用のいずれかです。

コンテンツ: オンザフライで生成される単純な HTML (文字列として)、埋め込まれた CSS 2.1、JS なし。

短編小説: Flying Saucer は最も使いやすく、レンダリングが最も正確ですが、コンテンツを完全に制御する必要があります。それ以外の場合は、ネイティブ ソリューションを探します。

長い話:

CSSBox の方が活発なようですが、一部のサードパーティ ライブラリに依存しているようです。たとえば、デモはデフォルトの Java 1.7 sax パーサーの動作方法を変更し、プログラムを壊した apache xerces を使用する nekohtml に依存していますが、Java の組み込み xerces を強制的に使用すると、ClassCastException (InlineBox to BlockBox). 最後にそれを機能させることはできません。さらに、既存のドキュメントを置き換える方法はまだ見つかっていません BrowserCanvas

Cobra はメンテナンスされなくなりました。1.7 で動作させるには、互換性の問題を手動で修正する必要があります。また、mozilla Rhino (JS を使用しない) を取得する必要がありますが、それだけです。その後はかなりスムーズで、Logger にペイント メッセージを非表示にするように指示するだけです。ドキュメントが単純である限り、レンダリングは正しく、速度はまあまあです。あまり一般的でないタグやより複雑なレイアウトを使用し始めると、Cobra はすぐに機能しなくなります。

Flying Saucer は、執筆時点 (2011 年 2 月) で 3 つの中で最高の CSS サポートを備えています。セットアップは非常に簡単です (たとえば、cobo のようなドキュメントや cssbox のような domparser をセットアップする必要はありません)。しかし、フライングソーサーは餌にとても厳しいです。ソースは整形式の XML である必要があります。たとえば、スタイルとスクリプトは CDATA でラップする必要があり、html エンティティを使用する場合は DTD を宣言する必要があります (したがって、html5 doctype はありません)。ただし、制御できるコンテンツを埋め込む場合は、これが最適な選択かもしれません。

于 2012-04-09T23:19:17.640 に答える
3

CSSBox はあなたが探しているものかもしれません: http://cssbox.sourceforge.net

于 2011-12-09T21:16:27.987 に答える
2

この記事をチェックしてください: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java

JEdi​​torPane およびその他の Swing クラスを使用して、HTML だけでなく CSS も解析およびレンダリングします。

于 2010-03-13T12:41:17.720 に答える
2

http://djproject.sourceforge.net/ns/のような方法でネイティブ ブラウザにアクセスすることもできます。

特定の Web ページでは、これが唯一の方法である場合があります。常にトレードオフがあります。

適切にレンダリングされ、オープン ソースであり、同時に十分な柔軟性を備えたブラウザー コンポーネントをまだ見つけていません。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

Flying Saucer は問題なく機能していましたが、次のレンダリングされたテキストの例は、Linux Java でのモバイル アプリ開発にとって大きな障害でした。

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

また、JTextPanel とは異なり、テキストは選択できません。

パーサーは UTF-8 エンコーディングのみを受け入れるようです。解析時に自分のエンコーディングを強制することができませんでした。

于 2016-02-09T22:03:36.290 に答える