JApplet和Java7中的JavaFX-可能吗?

JApplet和Java7中的JavaFX-可能吗?,java,swing,javafx,Java,Swing,Javafx,是否可以使用适用于Java7客户端的JavaFX内容来丰富基于Swing的JApplet(在web浏览器中运行)?我尝试了以下几件事,但没有成功: a) Swing JApplet:如果我尝试向JApplet添加JFXPanel,我会在运行时得到java.lang.ClassNotFoundException:javafx.embed.Swing.JFXPanel b) 包含javafx_版本参数的Swing JApplet(版本2.2+,请参阅使用部署工具包的dtjava.embed()时生成

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

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

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

c) JavaFX小程序(JavaFX.application.application):swing内容似乎只能在新的JFrame中显示(如Oracle的官方示例所示),而不能在JavaFX小程序(JavaFX.application.application)本身中显示。用Java8引入SwingNode显然是一个不错的选择,但我没有找到一个可靠的Java7替代方案


有没有办法通过将jfxrt.jar添加到类路径来运行选项a)(就像选项b显然在做的那样)?

Oracle有一个关于Java 7的详细教程

我建议您遵循该教程

请注意,没有必要将jfxrt.jar与应用程序打包在一起,也不建议打包(出于您在评论中提到的所有原因)


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

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


如果您没有使用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>

函数启动应用程序(jnlpfile){
dtjava.launch(
{url:jnlpfile},
{
javafx:'2.2+',
工具包:“swing”
},
{}
);
返回false;
}
测试页
启动测试应用程序。

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

这正是这个答案所解释的(至少是打包部分),javadoc描述了其余部分



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

我发现的一个有效解决方案是将jfxrt.jar(在我的例子中是7u51)中的类打包到包含小程序的.jar文件中,并对该jar文件进行签名。虽然这个解决方案对我来说很有用,但它相当愚蠢,因为a)jfxrt.jar已经存在于客户机7u51安装中,b)它显著增加了启动时间(+7mb,如果没有混淆的话,还可以加载),c)它可能会在客户机JRE(以及正在使用Java8的客户机的JavaFX)之间产生冲突。任何关于这方面的想法都非常感谢。谢谢你的贡献。我想我还不太清楚“inthejapplet”是什么意思:我想在浏览器窗口的JApplet区域内显示JavaFX内容(JFXPanel)。关于Java部署工具包,我创建了一个.jnlp文件,发现dtjava.launch()在一个新的独立于浏览器的窗口中打开一个javafx.application.application,而dtjava.embed()在一个浏览器div中打开一个javafx.application.application,而与toolkit=swing无关。我想JavaFXAnt工具也是一样的(还没有测试)。首先,必须使用JNLP启动支持JavaFX的JApplet(需要applet参数JNLP_href,或者使用javascript调用dtjava.embed()),否则jfxrt.jar在Java7中不可用。第二,我的.jnlp文件中必需的部分仍然有一个错误。现在一切正常。非常感谢你的帮助。
<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>