java html renderer




Reiner Java-HTML-Viewer/-Renderer zur Verwendung in einem scrollbaren Bereich (5)

Welche reinen Java-HTML-Viewer und -Renderer sind verfügbar? Die Anforderungen sind:

  • Es sollte die JComponent Schnittstelle implementieren, die im JComponent platziert werden Scrollable .
  • Es sollte vorzugsweise eine freie Lösung sein; Open Source ist ein Plus.
  • Seine Verfügbarkeit als Maven-Artefakt ist ein Plus.

Ich kenne nur einige wenige Komponenten und Projekte, von denen einige inzwischen nicht mehr existieren:


CSSBox könnte das sein wonach Sie suchen: CSSBox


Der Fliegende Untertasse machte den Job OK, aber das folgende gerenderte Textbeispiel war eine große Abzweigung für meine mobile App-Entwicklung auf Linux Java:

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

Außerdem ist der Text anders als für das JTextPanel nicht wählbar.

Parser scheint nur UTF-8-Codierung zu akzeptieren. Ich konnte es nicht schaffen, beim Parsen meine eigene Kodierung zu erzwingen.


Seit Java 8 können Sie die WebView-Komponente von JavaFX verwenden , die auch in Swing verwendet werden kann .

Code ist so einfach wie:

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 ) );
});

Es wird von der WebKit-Engine unterstützt (die Version hängt von JRE ab und ist relativ aktuell). Bedenken Sie jedoch, dass es sich nicht um einen vollständigen Browser handelt, also zählen Sie nicht auf HTML5-Audio / Video-Unterstützung. Ansonsten läuft HTML + CSS + JS so gut wie Ihr Browser.

Technisch gesehen ist die zugrunde liegende Engine C ++, kein natives Java. Aber es ist in Oracles offizieller JRE gebündelt, benötigt keine Bibliothek, hat keine Konfiguration, ist plattformübergreifend wie Java FX und wird aktiv aktualisiert und gewartet.

So gut wie natives Java für die meisten Anwendungsfälle, denke ich?

Die folgenden Informationen sind veraltet, da wir jetzt WebView in Java haben.

Versuchte Cobra/Lobo , CSSBox und fliegende Untertasse , alles pure Java. Andere sind entweder nativ oder kommerziell.

Inhalt: Einfacher HTML-Code, der im Handumdrehen generiert wird (als String), eingebettetes CSS 2.1, kein JS.

Kurzgeschichte: Fliegende Untertasse ist am einfachsten zu verwenden und zu rendern ist am richtigsten, aber Sie haben die volle Kontrolle über den Inhalt. Andernfalls suchen Sie nach einer nativen Lösung.

Lange Geschichte:

CSSBox scheint aktiver zu sein, jedoch scheint es auf einigen 3rd-Party-Bibliotheken zu beruhen. Zum Beispiel hängt die Demo von nekohtml ab, die apache xerces verwenden, was die Arbeitsweise des Java Java Parsers verändert und mein Programm kaputt gemacht hat, aber wenn ich es erzwinge Java's eingebaute Xerces zu benutzen, bekomme ich ClassCastException (InlineBox to BlockBox) . Kann es am Ende nicht zum Laufen bringen. Plus haben noch keine Möglichkeit gefunden, das Dokument in einem vorhandenen BrowserCanvas zu ersetzen.

Cobra wird nicht länger gewartet, muss ein Inkompatibilitätsproblem manuell beheben, damit es in 1.7 funktioniert. Auch müssen Sie Mozilla Rhino greifen (keine JS), aber das ist alles. Danach ist es ziemlich glatt, muss nur Logger bitten, Paint-Nachrichten zu verstecken. Render ist korrekt und Geschwindigkeit ist fair - solange das Dokument einfach ist. Wenn Sie weniger gebräuchliche Tags oder ein komplizierteres Layout verwenden, fällt Cobra ziemlich schnell auseinander.

Fliegende Untertasse hat die beste CSS-Unterstützung der drei zum Schreiben (Februar 2011). Die Einrichtung ist sehr einfach (zB keine Notwendigkeit, Dokumente wie cobo oder domparser wie cssbox einzurichten) hat wenig Abhängigkeit - was auch bedeutet, dass kein Javascript. Aber Fliegende Untertasse ist sehr streng darüber, was Sie es füttern. Die Quelle muss ein wohlgeformtes XML sein, zum Beispiel müssen Stil und Skript in CDATA verpackt sein, und wenn Sie HTML-Entitäten verwenden, müssen Sie DTD deklarieren (also keinen html5-Doctype). Wenn Sie jedoch Inhalte einbetten, die Sie steuern können, ist dies möglicherweise die beste Wahl.


Sie können den nativen Browser auch über Folgendes aufrufen: djproject

Für bestimmte Webseiten ist dies manchmal der einzige Weg. Es gibt immer Kompromisse.

Ich muss noch eine Browserkomponente finden, die gut rendert, Open Source ist und gleichzeitig flexibel genug ist. Cobra kommt nahe, aber es gibt Seiten, die nicht gerendert werden und es ist schwierig (unmöglich?) Dinge zu tun, wie zum Beispiel die eigenen Bildlaufleisten usw.


Wow, haferblues, ich hätte nie gedacht, dass ich etwas finden würde, was ich an JavaFX mag. Aber die Browser-Implementierung ist wirklich nett. Für diejenigen (wie mich), die JavaFx vorher noch nie die komplette Klasse (für den Schnipsel von Haferblues) benutzt haben:

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);
            }
        });
    }
}




html-rendering