是否可以使用适用于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)显然是在做某种方式)?
答案 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等价物。