JApplet和Java7中的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()时生成的小程序标记):将JFXPanel添加到JApplet会导致java.lang.ClassCastException:SwingInterop在运行时无法转换为javafx.application.application c) JavaFX小程序(JavaFX.application.application):swing内容似乎只能在新的JFrame中显示(如Oracle的官方示例所示),而不能在JavaFX小程序(JavaFX.application.application)本身中显示。用Java8引入SwingNode显然是一个不错的选择,但我没有找到一个可靠的Java7替代方案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()时生成
有没有办法通过将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>