web-dev-qa-db-fra.com

Pure Java Visualiseur / rendu HTML à utiliser dans un volet défilant

Quels sont les purificateurs Java visualiseurs et rendus HTML disponibles? Les exigences sont les suivantes:

  • Il doit implémenter l'interface JComponent à placer dans le volet Scrollable .
  • Il doit s'agir de préférence d'une solution gratuite; l'open source est un plus.
  • Sa disponibilité en tant qu'artefact Maven est un plus.

Je ne connais que quelques composants et projets, dont certains sont aujourd'hui disparus:

35
dma_k

Depuis Java 8, vous pouvez utiliser WebView Component de JavaFX, qui peut également être tilisé dans Swing .

Le code est aussi simple que:

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

Il est soutenu par le moteur WebKit (la version dépend de JRE et est raisonnablement à jour). Mais gardez à l'esprit qu'il ne s'agit pas d'un navigateur complet, alors ne comptez pas sur la prise en charge, disons, de l'audio/vidéo HTML5. Sinon, il exécute HTML + CSS + JS aussi bien que votre navigateur.

Techniquement, le moteur sous-jacent est C++, pas Java natif. Mais il est intégré dans le JRE officiel d'Oracle, ne nécessite aucune bibliothèque, n'a aucune configuration, est aussi multiplateforme que Java FX, et est activement mis à jour et maintenu.

Aussi bon que natif Java pour la plupart des cas d'utilisation, je pense?


Les informations ci-dessous sont obsolètes, car nous avons maintenant WebView en Java.

Essayé Cobra/Lobo , CSSBox , et Flying Saucer , tous pur Java. D'autres sont natifs ou commerciaux.

Contenu: HTML simple généré à la volée (sous forme de chaîne), CSS 2.1 intégré, pas de JS.

Petite histoire: Flying Saucer est le plus simple à utiliser et le rendu est le plus correct, mais vous feriez mieux d'avoir un contrôle total sur le contenu. Sinon, recherchez une solution native.

Longue histoire:

CSSBox semble être plus actif, mais cela semble dépendre de certaines bibliothèques tierces. Par exemple, la démo dépend de nekohtml qui utilise des xerces Apache qui ont changé la façon dont le parseur par défaut Java 1.7 sax fonctionne et a cassé mon programme, mais quand je le force à utiliser les xerces intégrés de Java, je reçois ClassCastException (InlineBox to BlockBox). Impossible de le faire fonctionner à la fin. De plus, nous n'avons toujours pas trouvé de moyen de remplacer le document dans un BrowserCanvas existant.

Cobra n'est plus maintenu, il faut corriger manuellement un problème d'incompatibilité pour le faire fonctionner en 1.7. Besoin également de saisir mozilla Rhino (sans utiliser de JS) mais c'est tout. Après cela, c'est assez fluide, il suffit de demander à Logger de masquer les messages Paint. Le rendu est correct et la vitesse est correcte - tant que le document est simple. Lorsque vous commencez à utiliser des balises moins courantes ou une mise en page plus compliquée, Cobra se désagrège assez rapidement.

Flying Saucer a le meilleur support CSS des trois au moment de la rédaction (février 2011). La configuration est très facile (par exemple, pas besoin de configurer un document comme cobo ou domparser comme cssbox) a peu de dépendances - ce qui signifie également pas de javascript. Mais la soucoupe volante est très stricte quant à ce que vous lui donnez. La source doit être un XML bien formé, par exemple le style et le script peuvent devoir être enveloppés dans CDATA et si vous utilisez des entités html vous devez déclarer DTD (donc pas de doctype html5). Cependant, si vous intégrez du contenu que vous pouvez contrôler, cela peut être votre meilleur choix.

33
Sheepy

Si vous utilisez Swing, vous pouvez intégrer une JavaFX WebView.

1) Devrait implémenter l'interface JComponent à placer dans le volet de défilement.

Pour ajouter WebView à Swing, vous devez l'ajouter à JFXPanel, qui est un JComponent. Pour que WebView remplisse le JFXPanel complet, j'ai utilisé un AnchorPane comme ceci:

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

Chaque fois que vous exécutez du code JavaFX, assurez-vous de l'exécuter dans Platform.runLater ().

2) Devrait être de préférence une solution libre; opensource est un plus.

Eh bien, c'est pur Oracle Java.

3) La disponibilité en tant qu'artefact maven est un plus.

Voir la réponse StackOverflow projet Maven avec JavaFX (avec fichier jar dans `lib`) pour des conseils sur l'intégration de JavaFX et Maven.

À partir de Java8, JavaFX sera entièrement intégré à Java.

Avantages supplémentaires: -supporte HTML5 et JavaScript (utilise webkit) -soutient l'interopérabilité de la plate-forme -même prend en charge l'interaction avec le DOM, exécuter JavaScript, être informé des événements de la vue Web.

Inconvénients: -JavaFX doit être installé. Mais il est livré avec Java depuis la v7u6 (août 2012).

Autres expériences:

J'ai essayé djproject , mais j'ai eu beaucoup de problèmes avec l'interopérabilité de la plateforme. Fonctionnait assez bien sur Windows, mais seulement avec un effort majeur sur Linux et je ne pouvais pas le faire fonctionner sur Mac. Pour chaque plate-forme, vous devez également créer une version 32 bits et 64 bits de votre bocal. Avec beaucoup d'efforts et un énorme fichier jar, vous pouvez éventuellement tout fusionner dans un seul bocal. Mais c'était loin d'être pratique.

Comparé à la solution JavaFX que j'ai mentionnée ci-dessus, le DJProject était une douleur beaucoup plus grande.

10
haferblues

Vous pouvez également accéder au navigateur natif via quelque chose comme: http://djproject.sourceforge.net/ns/

Pour certaines pages Web, c'est parfois la seule façon de procéder. Il y a toujours des compromis.

Je n'ai pas encore trouvé un composant de navigateur qui rend bien, est open source et suffisamment flexible en même temps. Cobra se rapproche mais il y a des pages qu'il ne rendra pas et il est difficile (impossible?) De faire des choses comme se débarrasser de ses propres barres de défilement, etc.

2
PSpeed

CSSBox pourrait être ce que vous cherchez: http://cssbox.sourceforge.net

2
stano

Consultez cet article: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-Java

Il utilise JEditorPane et quelques autres classes Swing pour analyser et rendre non seulement du HTML, mais aussi du CSS.

1
Sean A.O. Harney

Wow haferblues, je n'ai jamais pensé trouver quelque chose que j'aime dans JavaFX. Mais l'implémentation du navigateur est vraiment sympa. Pour ceux (comme moi) qui n'ont jamais utilisé JavaFx auparavant, voici la classe complète (pour l'extrait de 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);
            }
        });
    }
}
0
Bruno Eberhard

La soucoupe volante faisait le travail OK, mais l'exemple de texte rendu suivant était une énorme désactivation pour le développement de mon application mobile sur Linux Java:

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

De plus, le texte n'est pas sélectionnable contrairement au JTextPanel.

L'analyseur ne semble accepter que l'encodage UTF-8. Je n'ai pas réussi à forcer mon propre encodage lors de l'analyse.

0
Michael Fayad