Applet和Java 7中的JavaFX可能吗?

时间:2014-03-31 10:24:21

标签: 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)显然是在做某种方式)?

1 个答案:

答案 0 :(得分:2)

Oracle为Java 7提供了JavaFX in Swing Applications的详细教程。

我建议您按照该教程进行操作。

请注意,不需要使用应用程序打包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>

  

我想在浏览器窗口中的JApplet区域内显示JavaFX内容(JFXPanel)。

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


有关在Swing Applet中嵌入JavaFX的可执行示例,请参阅JavaFX“SwingInterop”示例代码。您可以从Java download page的“JDK 8演示和示例”链接下载SwingInterop示例代码。 Java 7下载档案也可以提供Java 7等价物。