Applet 和 Java 7 中的 JavaFX - 可能吗?

标签 java swing javafx

是否可以使用适用于 Java7 客户端的 JavaFX 内容来丰富基于 Swing 的 JApplet(在 Web 浏览器中运行)?我尝试了以下操作,但没有成功:

a) Swing JApplet:如果我尝试将 JFXPanel 添加到 JApplet,我会在运行时得到 java.lang.ClassNotFoundException: javafx.embed.swing.JFXPanel

b) 包含 javafx_version 参数的 Swing JApplet(版本 2.2+,使用部署工具包的 dtjava.embed() 时查看生成的 APPLET 标记):将 JFXPanel 添加到 JApplet 会导致 java.lang.ClassCastException:SwingInterop 无法在运行时转换为 javafx.application.Application

c) JavaFX Applet (javafx.application.Application):swing 内容似乎只能在新的 JFrame 中显示(如 http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html 的官方 Oracle 示例所示)但不能在 JavaFX Applet (javafx.application.Application) 本身中。随 Java8 引入的 SwingNode 显然是可行的方法,但我没有找到 Java7 的可靠替代方案。

有什么方法可以通过将 jfxrt.jar 添加到类路径来让选项 a) 运行(因为选项 b)显然以某种方式运行)?

最佳答案

Oracle JavaFX in Swing Applications上有详细教程适用于 Java 7。

我建议您遵循该教程。

请注意,将 jfxrt.jar 与应用程序一起打包不是必需的,也不推荐(出于您在评论中提出的所有原因)。


只需复制并粘贴 Oracle 教程中的示例,以防它们的链接失效。

使用 JavaFX Ant 任务打包具有集成 JavaFX 内容的 Swing 应用程序(关键是 toolkit="swing"):

<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
        uri="javafx:com.sun.javafx.tools.ant"
        classpath="${javafx.sdk.path}/lib/ant-javafx.jar"/>

<fx:jar destfile="dist-web/ColorfulCircles.jar">
    <fx:application refid="myapp"/>
    <fileset dir="build/classes/">
        <include name="**"/>
    </fileset>
</fx:jar>

<fx:deploy width="800" height="600" outdir="dist-web" 
        outfile="SwingInterop">
    <fx:info title="Swing Interop"/>
    <!-- Mark application as a Swing app -->
    <fx:application id="myapp" 
            mainClass="swinginterop.SwingInterop"
            toolkit="swing"/>
    <fx:resources>
        <fx:fileset dir="dist-web" includes="SwingInterop.jar"/>
    </fx:resources>
</fx:deploy> 

如果您不使用 JavaFX 打包工具,您仍然可以使用 JavaFX,只需编辑您的 jnlp 文件,使用 jfx 命名空间设置资源:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0"
        xmlns:jfx="http://javafx.com"
        href="SwingAppWithJavaFXContent.jnlp"
        ...>
     ....
    <resources>
        <j2se version="1.7.0_06+" 
            href="http://java.sun.com/products/autodl/j2se"/>
        <jfx:javafx-runtime version="2.1+" 
            href="http://javadl.sun.com/webapps/download/GetFile/
                    javafx-latest/windows-i586/javafx2.jnlp"/>
    </resources>
    ...
</jnlp> 

在您的 html 页面中,您嵌入了 Java 部署工具包并使其支持 JavaFX:

<html>
    <head>
            <SCRIPT src="http://java.com/js/dtjava.js"></SCRIPT>
            <script>
                function launchApplication(jnlpfile) {
                dtjava.launch(
                    { url : jnlpfile },
                    {
                        javafx : '2.2+',
                        toolkit: 'swing'
                    },
                    {}
                );
                return false;
            }
        </script>
    </head>
    <body>
        <h2>Test page</h2>
        <a href='SampleApp.jnlp' 
        onclick="return launchApplication('SampleApp.jnlp');">Click</a> 
        to launch test app.
    </body>
</html>

I want to show JavaFX content (a JFXPanel) within the area of a JApplet within a browser window.

这正是这个答案解释了如何做的(至少是包装部分),JFXPanel javadoc 描述了其余部分。


有关将 JavaFX 嵌入 Swing Applet 的可执行示例,请参阅 JavaFX“SwingInterop”示例代码。您可以从 Java download page 的“JDK 8 演示和示例”链接下载 SwingInterop 示例代码。 . Java 7 下载文件中也提供了 Java 7 等效版本。

关于Applet 和 Java 7 中的 JavaFX - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759134/

相关文章:

java - 为什么我的文本不打印到我的 JTextArea?

java - 如何更改 CSS 第 7 系列上方的 javaFX LineChart 中的图标?

java - 双代理接口(interface) : Could not generate CGLIB subclass of class 时 Spring AspectJ 失败

java - 支持 JavaScript 的 Java 轻量级代码编辑器小部件

java - 应用程序启动时保存到 session

带有输入提示的 Java JTextField

具有泛型类的 JavaFX 自定义 ComboBox

java - 如何使 JavaFX 对象出现在 FXML 中?

java - 让 Java 监听剪贴板并将新值推送到列表

java - 在特定时间重置变量(在应用重启后也继续这样做)