Интеграция JavaFX 2.0 WebView в приложение Swing Java SE 6
Я искал способ интеграции Web-Browser-Component в существующее Swing-приложение и нашел WebView для Java FX 2.0. Кроме того, я нашел сообщение в блоге на java.net, показывающее, как интегрировать компонент Java FX в приложение Swing. Я думаю, это может быть выполнимо, но я еще не пробовал.
Мне любопытно, как вы думаете, это хороший подход? Есть ли лучшие решения? Это вообще выполнимо? Может быть, там что-то предопределено?
Мотивация такова: я хочу интегрировать некоторый WebBrowser-что угодно, в существующее Swing-приложение, долгосрочная цель которого состоит в том, чтобы вообще избавиться от всего Java Desktop Application, заменив его веб-решением (план состоит в том, чтобы медленно преобразовывать существующие аспекты в веб-страницы, которые затем отображаются в компоненте WebBrowser, пока от свинг-приложения не останется ничего, кроме скелета браузера). Бэкэнд, конечно же, остается Java:-)
Я еще не пробовал, так как мне просто не хватает времени на интеграцию JavaFX с моим проектом (это работа, мы просто изучаем альтернативы в долгосрочной перспективе), поэтому лучше спросить, прежде чем я сгорю.
2 ответа
Это очень хорошо возможно!
Нужно установить 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();
}
});
}
}
Если вам нужно встроить облегченный веб-браузер 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.
Это бесплатно для проектов с открытым исходным кодом;)