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

je cherchais un moyen d'intégrer une composante de navigateur Web dans une application Swing existante et j'ai trouvé WebView pour Java FX 2.0. En outre, j'ai trouvé un billet de blog sur java.net montrant comment intégrer un composant Java FX dans une Application Swing . Je suppose que c'est faisable, mais je n'ai pas encore essayé.

je suis curieux, vous pensez que c'est une bonne approche? Sont-il de meilleures solutions? Est-il faisable? Est peut-être quelque chose prebundled?

la motivation est: je veux intégrer quelques WebBrowser - peu importe dans une Application Swing existante, le but à long terme étant de se débarrasser de L'ensemble de L'Application Java Desktop du tout, en le remplaçant par une solution basée sur le web (le plan est de transformer lentement les aspects existants en pages web qui sont ensuite affichés dans le composant WebBrowser-jusqu'à ce que rien ne reste de la swing application sauf pour le navigateur-squelette). Le backend, bien sûr, reste Java :-)

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

32
demandé sur scravy 2011-12-04 13:18:30

2 réponses

c'est très bien possible!

il faut installer JavaFX 2.0 , et d'une manière ou d'une autre 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, le WebView se sent plutôt bâclé. Je travaille sur Mac OS X 10.6; JavaFX 2.0 est encore en version bêta pour OS X.

Alternatives j'ai trouvé inclure MozSwing , qui semble très prometteur et se sent assez rapide en fait. Malheureusement le projet n'est pas développé plus loin depuis 2008 et le coureur XUL empaqueté est plutôt Vieux (pas de nouvelle fantaisie html 5).

les deux approches sont un cauchemar à inclure via maven, vous feriez mieux de configurer votre propre dépôt 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
répondu scravy 2011-12-07 09:48:31

si vous avez besoin d'intégrer Swing léger navigateur web basé sur le moteur de Chrome, vous pouvez jeter un oeil à jxbrowser bibliothèque. Le code suivant montre comment intégrer un composant de 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 Chromium engine.

C'est gratuit pour les projets open source ;)

3
répondu Vladimir 2015-04-17 14:01:55