selectors - Visualizador/visualizador HTML Pure Java para usar en un panel desplazable
jsoup library jar (7)
CSSBox puede ser lo que estás buscando: CSSBox
¿Qué visualizadores y visualizadores de HTML puro de Java están disponibles? Los requisitos son:
- Debería implementar la interfaz
JComponent
para colocarse en el panelScrollable
. - Debería ser preferiblemente una solución gratuita; el código abierto es un plus.
- Su disponibilidad como artefacto Maven es un plus.
Solo conozco algunos componentes y proyectos, algunos de los cuales ahora están difuntos:
- Built-in
JEditorPane
, soporta HTML 3.2 (a partir de Java 1.4) - DJ Project (¿es Java puro?)
- Ekit por hexidec (se basa en
javax.swing.text.html.HTMLEditorKit
) - JSyndrome HTML Editor por Sferyx
-
JWebPane
(¿alguna vez fue lanzado)? - JDIC (abandonado; de alguna información here veo que es nativa)
- ( WebRenderer PDF) WebRenderer (antiguo XHTMLRenderer )
Desde Java 8, puede usar el componente WebView de JavaFX, que también se puede usar en Swing .
El código es tan simple como:
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 ) );
});
Está respaldado por el motor WebKit (la versión depende de JRE y está razonablemente actualizada). Pero tenga en cuenta que no es un navegador completo, por lo tanto, no cuente con el soporte de, por ejemplo, audio / video HTML5. De lo contrario, ejecuta HTML + CSS + JS tan bueno como su navegador.
Técnicamente, el motor subyacente es C ++, no Java nativo. Pero está incluido en el JRE oficial de Oracle, no requiere biblioteca, tiene cero configuración, es tan multiplataforma como Java FX, y se actualiza y mantiene activamente.
¿Tan bueno como Java nativo para la mayoría de los casos de uso, creo?
La información a continuación no está actualizada, ya que ahora tenemos WebView en Java.
Intentó Cobra/Lobo , CSSBox y Flying Saucer , todos puros de Java. Otros son nativos o comerciales.
Contenido: HTML simple generado sobre la marcha (como cadena), CSS incrustado 2.1, sin JS.
Cuento: Flying Saucer es el más simple de usar y el renderizado es el más correcto, pero es mejor tener un control total sobre el contenido. De lo contrario, busque una solución nativa.
Larga historia:
CSSBox parece ser más activo, sin embargo, parece depender de algunas bibliotecas de terceros. Por ejemplo, la demostración depende de nekohtml que usa apache xerces que cambió la forma en que funciona el analizador de sax de Java 1.7 y rompió mi programa, pero cuando lo obligo a usar las xerces integradas de Java obtengo ClassCastException (InlineBox to BlockBox)
. No puedo hacer que funcione al final. Además, todavía no se ha encontrado una manera de reemplazar el documento en un BrowserCanvas
existente.
Cobra ya no se mantiene, tiene que corregir manualmente un problema de incompatibilidad para que funcione en 1.7. También es necesario tomar Mozilla Rhino (sin usar ningún JS) pero eso es todo. Después de eso, es bastante sencillo, solo hay que pedirle a Logger que oculte los mensajes de pintura. Render es correcto y la velocidad es buena, siempre que el documento sea simple. Cuando empiezas a usar etiquetas menos comunes o diseños más complicados, Cobra se deshace rápidamente.
Flying Saucer tiene el mejor soporte de CSS de los tres a partir de la escritura (febrero de 2011). La configuración es muy fácil (por ejemplo, no hay necesidad de configurar documentos como cobo o domparser como cssbox) tiene poca dependencia, lo que también significa que no hay javascript. Pero Flying Saucer es muy estricto sobre lo que le das de comer. La fuente debe ser un XML bien formado, por ejemplo, el estilo y el guión pueden tener que ser envueltos en CDATA y si usted usa entidades html debe declarar DTD (por lo tanto, no docype html5). Sin embargo, si está integrando contenido que puede controlar, entonces puede ser su mejor opción.
Mira este artículo: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java
Utiliza JEditorPane y algunas otras clases de Swing para analizar y representar no solo HTML, sino también CSS.
Si está utilizando Swing, puede incrustar JavaFX WebView.
1) Debería implementar la interfaz JComponent para colocarse en el panel Desplazable.
Para agregar WebView a Swing, debe agregarlo a JFXPanel, que es un JComponent. Para hacer que WebView llene el JFXPanel completo, utilicé un AnchorPane como ese:
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);
Siempre que ejecute código JavaFX, asegúrese de ejecutarlo en Platform.runLater ().
2) Debería ser preferiblemente una solución gratuita; opensource es un plus.
Bueno, es puro Oracle Java.
3) La disponibilidad como artefacto experto es un plus.
Vea el proyecto answer Maven con JavaFX (con el archivo jar en `lib`) para obtener consejos sobre la integración de JavaFX y Maven.
Desde Java8 en JavaFX estará completamente integrado en Java.
Pros adicionales: admite HTML5 y JavaScript (usa webkit), admite la interoperabilidad de la plataforma, incluso admite la interacción con DOM, ejecuta JavaScript y recibe notificaciones de eventos desde Webview.
Contras: -JavaFX necesita ser instalado. Pero viene incluido con Java desde v7u6 (agosto de 2012).
Otras experiencias:
Intenté djproject , pero tuve muchos problemas con la interoperabilidad de la plataforma. Funcionó bastante bien en Windows, pero solo con un gran esfuerzo en Linux y no pude hacer que funcionara en Mac. Para cada plataforma, también necesita construir una versión de 32 bits y 64 bits de su jar. Con mucho esfuerzo y un gran archivo jar, posiblemente podría fusionar todo en un solo contenedor. Pero esto estaba lejos de ser conveniente.
Comparado con la solución JavaFX que mencioné anteriormente, DJProject era un dolor mucho más grande.
También puede acceder al navegador nativo a través de algo como: djproject
Para ciertas páginas web, esta es a veces la única manera de hacerlo. Siempre hay compensaciones.
Todavía tengo que encontrar un componente de navegador que rinda bien, es de código abierto y suficientemente flexible al mismo tiempo. Cobra se acerca, pero hay páginas que no se mostrarán y es difícil (¿imposible?) Hacer cosas como deshacerse de sus propias barras de desplazamiento, etc.
The Flying Saucer estaba haciendo el trabajo bien, pero el siguiente ejemplo de texto representado fue un gran obstáculo para el desarrollo de mi aplicación móvil en Linux Java:
Sometimes the period at the end changes line without the text beside .
Además, el texto no se puede seleccionar a diferencia del JTextPanel.
El analizador solo parece aceptar la codificación UTF-8. No pude forzar mi propia codificación al analizar.
Wow haferblues, nunca pensé que encontraría algo que me gustara de JavaFX. Pero la implementación del navegador es realmente agradable. Para aquellos (como yo) que nunca han usado JavaFx aquí la clase completa (para el fragmento 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);
}
});
}
}