将 JavaFX 2.0 WebView 集成到 Swing Java SE 6 应用程序中

我正在寻找一种将Web浏览器组件集成到现有Swing应用程序中的方法,并找到了WebView for Java FX 2.0。此外,我还在 java.net 上找到了一篇博客文章,展示了如何将Java FX组件集成到Swing应用程序中。所以我想这可能是可行的,但我还没有尝试过。

我很好奇,你认为这是一个好方法吗?有没有更好的解决方案?它甚至可行吗?也许有什么东西是预先捆绑出来的?

动机是:我想将一些WebBrowser(无论什么)集成到现有的Swing应用程序中,其长期目标是完全摆脱整个Java桌面应用程序,用基于Web的解决方案取而代之(计划是将现有方面慢慢转换为网页,然后显示在WebBrowser组件中,直到除了浏览器骨架之外,Swing应用程序什么都不剩下)。后端当然仍然是Java:-)

我还没有尝试过,因为我根本没有时间将JavaFX与我的项目集成(这是一项工作,我们只是在长期探索替代方案),所以我最好在我被烧毁之前问问。


答案 1

这是很有可能的!

必须安装JavaFX 2.0,并以某种方式设法在Classpath中安装JavaFX 2.0jfxrt.jar

下面的代码在 JFrame 中呈现一个 JFXPanel。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();
            }
        });
    }
}

答案 2

推荐