Интеграция JavaFX 2.0 WebView в приложение Swing Java SE 6 - PullRequest
32 голосов
/ 04 декабря 2011

Я искал способ интеграции компонента веб-браузера в существующее Swing-приложение и нашел WebView для Java FX 2.0. Кроме того, я нашел сообщение в блоге на java.net, показывающее , как интегрировать компонент Java FX в приложение Swing . Думаю, это возможно, но я еще не пробовал.

Мне любопытно, как вы думаете, это хороший подход? Есть ли лучшие решения? Это вообще выполнимо? Может быть, там что-то предопределено?

Мотивация такова: Я хочу интегрировать некоторый WebBrowser- независимо от в существующее Swing-приложение, долгосрочная цель которого - избавиться от всего Java Desktop Application на все, заменив его веб-решением (план состоит в том, чтобы постепенно преобразовать существующие аспекты в веб-страницы, которые затем отображаются в компоненте WebBrowser, пока от свинг-приложения не останется ничего, кроме скелета браузера). Бэкэнд, конечно, остается Java: -)

Я еще не пробовал, так как мне просто не хватает времени на интеграцию JavaFX с моим проектом (это работа, мы просто изучаем альтернативы в долгосрочной перспективе), поэтому лучше спросить, прежде чем сгореть.

Ответы [ 2 ]

18 голосов
/ 07 декабря 2011

Это очень хорошо возможно!

Нужно установить JavaFX 2.0 , и каким-то образом удается получить jfxrt.jar в Classpath.

Отрисовывается следующий код JFXPanel внутри JFrame.JFXPanel содержит WebView , который загружает google.com.

Однако, по крайней мере на моем компьютере, WebView выглядит довольно небрежно.Я работаю на Mac OS X 10.6;JavaFX 2.0 все еще находится в стадии бета-тестирования для OS X.

Альтернативы Я обнаружил, что они включают MozSwing , который выглядел очень многообещающе и на самом деле довольно быстро.К сожалению, проект больше не разрабатывается с 2008 года, а встроенный XUL-раннер довольно стар (нет новых причудливых HTML 5).

Оба подхода - кошмар, который нужно включить через maven, лучше настроить собственный локальный репозиторий..

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();
            }
        });
    }
}
3 голосов
/ 17 апреля 2015

Если вам нужно встроить облегченный веб-браузер Swing на базе движка Chromium, вы можете взглянуть на библиотеку JxBrowser . Следующий код демонстрирует, как встроить компонент браузера в JFrame и загрузить некоторую веб-страницу:

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");
    }
}

Веб-страница будет отображаться с помощью механизма Chromium.

...