web-dev-qa-db-fra.com

Intégration de JavaFX 2.0 WebView dans une Swing Java Application SE 6

Je cherchais un moyen d'intégrer un composant de navigateur Web dans une application Swing existante et j'ai trouvé WebView pour Java FX 2.0. De plus, j'ai trouvé un article de blog sur Java.net montrant comment intégrer un Java FX dans une application Swing . Donc je suppose que cela pourrait être faisable, mais je n'ai pas encore essayé.

Je suis curieux, pensez-vous que c'est une bonne approche? Y a-t-il de meilleures solutions? Est-ce même faisable? Y a-t-il peut-être quelque chose de pré-groupé?

La motivation est: Je veux intégrer du WebBrowser - peu importe dans une application Swing existante, à long terme l'objectif étant de se débarrasser de l'ensemble Java Desktop Application du tout, en le remplaçant par une solution basée sur le Web (le plan est de convertir lentement les aspects existants en pages Web qui sont ensuite affichées dans le WebBrowser- Composant jusqu'à ce qu'il ne reste plus rien de l'application swing à l'exception du navigateur-skeleton. Le backend reste bien sûr Java :-)

Je n'ai pas encore essayé car je n'ai tout simplement pas le temps d'intégrer JavaFX à mon projet (c'est un travail, nous explorons simplement des alternatives pour le long terme), donc je ferais mieux de demander avant de me brûler.

32
scravy

C'est très bien possible!

Il faut installer JavaFX 2. , et en quelque sorte réussir à avoir jfxrt.jar dans le chemin de classe.

Le code suivant rend un JFXPanel à l'intérieur d'un JFrame. Le JFXPanel contient un WebView qui charge google.com.

Cependant, au moins sur ma machine, la WebView semble plutôt bâclée. Je travaille sur Mac OS X 10.6; JavaFX 2.0 est toujours en version bêta pour OS X.

Alternatives J'ai trouvé include MozSwing , qui avait l'air très prometteur et qui semble assez rapide en fait. Malheureusement, le projet n'est plus développé depuis 2008 et le coureur XUL fourni est plutôt ancien (pas de nouveau html 5 fantaisie).

Les deux approches sont un cauchemar à inclure via maven, vous feriez mieux de configurer votre propre référentiel 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();
            }
        });
    }
}
18
scravy

Si vous devez intégrer un navigateur Web léger Swing basé sur le moteur Chromium, vous pouvez jeter un œil à la bibliothèque JxBrowser . Le code suivant montre comment incorporer le composant Navigateur dans JFrame et charger une page 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 page Web sera rendue par le moteur Chromium.

3
Vladimir