ti-enxame.com

Integrando o JavaFX 2.0 WebView a um Swing Java Aplicativo SE 6

Eu estava procurando uma maneira de integrar um componente de navegador da Web em um aplicativo Swing existente e encontrei WebView for Java FX 2.0. Além disso, encontrei uma postagem no blog no Java.net mostrando como integrar um componente Java FX em um aplicativo Swing . Então acho que pode ser possível, mas ainda não tentei.

Estou curioso, você acha que essa é uma boa abordagem? Existem soluções melhores? É mesmo factível? Talvez haja algo pré-organizado por aí?

A motivação é: Quero integrar algum WebBrowser - qualquer que seja em um aplicativo Swing existente, o o objetivo a longo prazo é livrar-se de todo o Java Aplicativo de Desktop, substituindo-o por uma solução baseada na Web (o plano é converter lentamente os aspectos existentes em páginas da Web que são exibidas em WebBrowser-Component até que nada reste do aplicativo swing, exceto pelo esqueleto do navegador.) O back-end, é claro, permanece Java :-)

Ainda não tentei desde que simplesmente não tenho tempo para integrar o JavaFX ao meu projeto (é um trabalho, estamos apenas explorando alternativas a longo prazo), então é melhor perguntar antes de me queimar.

32
scravy

É muito bem possível!

É preciso instalar JavaFX 2. , e de alguma forma conseguir ter jfxrt.jar no caminho de classe.

O código a seguir renderiza um JFXPanel dentro de um JFrame. O JFXPanel contém um WebView que carrega google.com.

No entanto, pelo menos na minha máquina, o WebView parece um pouco desleixado. Estou trabalhando no Mac OS X 10.6; O JavaFX 2.0 ainda está na versão beta para OS X.

Alternativas Encontrei include MozSwing , que parecia muito promissor e parece bastante rápido na verdade. Infelizmente, o projeto não está mais sendo desenvolvido desde 2008 e o XUL runner incluído é bastante antigo (nenhum novo html sofisticado 5).

Ambas as abordagens são um pesadelo para incluir via maven; é melhor configurar seu próprio repositório 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

Se você precisar incorporar o navegador leve do Swing com base no mecanismo Chromium, consulte a biblioteca JxBrowser . O código a seguir demonstra como incorporar o componente Browser no JFrame e carregar alguma página da 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");
    }
}

A página da web será renderizada pelo mecanismo Chromium.

3
Vladimir