2011-12-04 12 views
32

Estaba buscando una forma de integrar un componente de navegador web en una aplicación Swing existente y encontré WebView para Java FX 2.0. Además, encontré una publicación de blog en java.net que muestra how to integrate a Java FX component into a Swing Application. Así que supongo que podría ser factible, pero aún no lo he intentado.Integración de WebView de JavaFX 2.0 en una aplicación Swing Java SE 6

Tengo curiosidad, ¿crees que este es un buen enfoque? ¿Hay mejores soluciones? ¿Es incluso factible? ¿Es quizás algo prefabricado por ahí?

La motivación es: Quiero integrar algunas WebBrowser- lo en un columpio-aplicación existente, el objetivo a largo plazo es deshacerse de toda la aplicación Java Desktop en absoluto, su sustitución por una web basada en la solución (el plan es convertir lentamente los aspectos existentes en páginas web que luego se muestran en el componente WebBrowser hasta que no quede nada de la aplicación swing excepto el esqueleto del navegador). El backend por supuesto sigue siendo Java :-)

No lo he intentado todavía porque simplemente no tengo tiempo para integrar JavaFX con mi proyecto (es un trabajo, solo estamos explorando alternativas a largo plazo), entonces mejor preguntar antes de que me queme.

+0

+1 demasiado duras manzanas mezcla de trabajo con los plátanos, – mKorbel

Respuesta

18

¡Es muy posible!

Uno tiene que instalar JavaFX 2.0, y de alguna manera logra tener jfxrt.jar en el Classpath.

El siguiente código representa JFXPanel dentro de un JFrame. El JFXPanel contiene un WebView que carga google.com.

Sin embargo, al menos en mi máquina, el WebView se siente bastante descuidado. Estoy trabajando en Mac OS X 10.6; JavaFX 2.0 está todavía en fase beta para OS X.

Alternativas encontré incluir MozSwing, que parecía muy prometedor y se siente realmente bastante rápido. Lamentablemente, el proyecto no se está desarrollando más desde 2008 y el corredor XUL incluido es bastante viejo (no es un nuevo html 5).

Ambos enfoques son una pesadilla para incluir via maven, es mejor configurar su propio repositorio local.

import java.awt.Dimension; 
import java.awt.Point; 

import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class JavaFX { 

    /* Create a JFrame with a JButton and a JFXPanel containing the WebView. */ 
    private static void initAndShowGUI() { 
     // This method is invoked on Swing thread 
     JFrame frame = new JFrame("FX"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().setLayout(null); // do the layout manually 

     final JButton jButton = new JButton("Button"); 
     final JFXPanel fxPanel = new JFXPanel(); 

     frame.add(jButton); 
     frame.add(fxPanel); 
     frame.setVisible(true); 

     jButton.setSize(new Dimension(200, 27)); 
     fxPanel.setSize(new Dimension(300, 300)); 
     fxPanel.setLocation(new Point(0, 27)); 

     frame.getContentPane().setPreferredSize(new Dimension(300, 327)); 
     frame.pack(); 
     frame.setResizable(false); 

     Platform.runLater(new Runnable() { // this will run initFX as JavaFX-Thread 
      @Override 
      public void run() { 
       initFX(fxPanel); 
      } 
     }); 
    } 

    /* Creates a WebView and fires up google.com */ 
    private static void initFX(final JFXPanel fxPanel) { 
     Group group = new Group(); 
     Scene scene = new Scene(group); 
     fxPanel.setScene(scene); 

     WebView webView = new WebView(); 

     group.getChildren().add(webView); 
     webView.setMinSize(300, 300); 
     webView.setMaxSize(300, 300); 

      // Obtain the webEngine to navigate 
     WebEngine webEngine = webView.getEngine(); 
     webEngine.load("http://www.google.com/"); 
    } 

    /* Start application */ 
    public static void main(final String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       initAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

Esto funciona bien para mí, pero es increíblemente lento. (factor 10-100 más lento que en el navegador del sistema para mi aplicación jquery). ¿Alguna idea de por qué? ¿Es JavaFX o tal vez la forma en que lo usas? – Daniel

+0

Creo que es JavaFX. Como mencioné, en mi máquina también es lento, pero pensé que esto podría deberse al hecho de que sigue siendo beta en OS X. – scravy

+0

He tenido los mismos problemas en Win7x64 y WinXP FYI – Daniel

3

Si necesita integrar oscilación navegador web ligero basado en el motor de cromo, se puede echar un vistazo a JxBrowser biblioteca. El código siguiente muestra cómo insertar el componente Browser hasta JFrame y carga alguna página web:

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.swing.BrowserView; 

import javax.swing.*; 
import java.awt.*; 

/** 
* This sample demonstrates how to create Browser instance, 
* embed it into Swing BrowserView container, display it in JFrame and 
* navigate to the "www.google.com" web site. 
*/ 
public class BrowserSample { 
    public static void main(String[] args) { 
     Browser browser = new Browser(); 
     BrowserView browserView = new BrowserView(browser); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(browserView, BorderLayout.CENTER); 
     frame.setSize(700, 500); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     browser.loadURL("http://www.google.com"); 
    } 
} 

la página Web será comunicada por el motor de cromo.

Es gratis para los proyectos de código abierto;)

+0

¡Muchas gracias por la pista! –

+1

NO ES GRATIS ... –

+0

Utilice el formulario web [Evaluación] (https://www.teamdev.com/jxbrowser#evaluate) para solicitar una licencia de código abierto gratuita. – Vladimir

Cuestiones relacionadas