我为 jre 1.7、jre 1.6 和 jre 1.5 编写了一个用于屏幕捕获的小程序。小程序必须为其窗口使用透明背景。但是对于半透明 jre 1.7(graphicDevice window Translucency) 和 1.6(awtutilities) 使用不同的 api 并且 jre 1.5 有解决方法。现在如何使我的小程序兼容所有三个版本?
我想我必须用不同的编译器编译不同的类。但是如何在单个应用程序中使用这些单独编译的类呢?
根据参考文章..
好的,我觉得我应该在这个阶段加入,因为我对@Alexie 的评论投了赞成票......并写了这篇文章和小程序。;)
第 1 名。我基本上已经忘记了那个小程序,并打算建议使用 JWS/嵌入式小程序,但这仅适用于 1.6_10+(那是 Sun 发布 Plug-In 2 JRE 的时候——与其他 JRE 制造商不同)。
然后,当我查看小程序时,很明显 Alexie 已经成功了。只需几页,一些特定于版本的罐子和一点“跳过箍”,它就可以满足规范。
这是它的工作原理。
applet.html
,使用archive="appletcommon.jar,applet7.jar"
)。使用Java 版本检查器小程序检查 1.7(或更高版本)。如果不可用:
applet6.html
, 对于 1.6 archive="appletcommon.jar,applet6.jar"
。如果不可用:
applet5.html
, 对于 1.5 archive="appletcommon.jar"
。如果不可用:
deployJava.js
此处来询问“1.2+ Java”——甲骨文将提供最新的公开发布版本——我不确定 Apple 或 *nix,但希望相同。这里重要的是对各种档案内容的精细描述。那分解为。
appletcommon.jar
与此小程序可用的最低版本(在本例中为 1.5)兼容的核心小程序类。- 编译期间的源/目标必须==1.5,并且applet6.jar
有 1.6 节课。同上编译选项。applet7.jar
有 1.7 节课。同上编译选项(除非使用 1.7 SDK 编译)。如果在不同版本的 java 中存在相同功能的不同 API(如 java 1.7 中的 JWindow.setOpacity() 和 java 1.6 中的 AWTUtilities.setWindowOpacity()),那么我们可以使用类的动态加载来使用 API,具体取决于类 wrt java 版本的可用性。这是解决我的情况的代码:
try
{
Class<?> cls = Class.forName("javax.swing.JWindow");
Method meth = cls.getMethod("setOpacity", float.class);
meth.invoke(transparentWindow, 0.50f);
}
catch (Throwable e)
{
e.printStackTrace();
try
{
Class<?> cls = Class.forName("com.sun.awt.AWTUtilities");
Method meth = cls.getMethod("setWindowOpacity", Window.class,
float.class);
meth.invoke(null, transparentWindow, 0.50f);
}
catch (Throwable e1)
{
e1.printStackTrace();
}
}
希望它像以前一样对初学者有所帮助:)