【问题标题】:Integrating JavaFX 2.0 WebView into a Swing Java SE 6 Application将 JavaFX 2.0 WebView 集成到 Swing Java SE 6 应用程序中
【发布时间】:2012-01-12 13:07:49
【问题描述】:

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

我很好奇,你认为这是一个好方法吗?有没有更好的解决方案?它甚至可行吗?可能是预先捆绑了一些东西吗?

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

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

【问题讨论】:

  • +1 把苹果和香蕉混合起来太难了,

标签: java swing webview desktop-application javafx


【解决方案1】:

很有可能!

必须安装JavaFX 2.0,并设法在类路径中包含jfxrt.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();
            }
        });
    }
}

【讨论】:

  • 这对我来说很好,但速度非常慢。 (比我的 jquery 应用程序的系统浏览器慢 10-100 倍)。知道为什么吗?是 JavaFX 还是你使用它的方式?
  • 我相信它是 JavaFX。正如我所提到的,在我的机器上它也很慢,但我认为这可能是因为它在 OS X 上仍然是测试版。
  • 我在 Win7x64 和 WinXP 上也遇到过同样的问题,仅供参考
  • 如果我从代码构建一个 jar 文件并提供给安装了 Java 但没有安装 JavaFX 的人,它会起作用吗?
  • JavaFX 与 Java SE 7 捆绑在一起。
猜你喜欢
  • 2014-04-12
  • 2013-05-29
  • 2019-07-23
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2015-01-02
  • 2021-02-28
相关资源
最近更新 更多