我目前有一个很小的Java applet,我正在编写它,以浏览器中立的方式解决我们公司intranet中的一个特定问题。这以前是用ActiveX来完成的,但是我们想让人们远离IE。显然,该代码对于公众消费是不安全的,但在受控制的情况下是有用的。本质上,我希望用户能够单击他们的链接,并根据AJAX调用返回的数据打开安装在本地机器上的应用程序。这是一个签名的Java applet,证书已在本地机器上被接受。
目前,这在IE和Opera中工作得很好,但在Chrome和Safari中却失败了。看起来,cause ()方法实际上并不会导致重绘,这是我正在努力解决的。下面是applet代码:
import java.applet.Applet;
import java.awt.Graphics;
import java.util.*;
public class OdehAppLauncher extends Applet {
private ArrayList<String> toRun = null;
public void paint(Graphics g) {
System.out.println("-----painting");
try {
if (toRun != null) {
new ProcessBuilder(toRun).start();
toRun = null;
}
} catch (Exception e) {
System.out.println("-----Exception e = " + e);
e.printStackTrace();
}
}
public void runApp(String appName, String args) {
System.out.println("-----running app: " + appName);
toRun = new ArrayList<String>(2);
toRun.add(appName);
toRun.add(args);
System.out.println("-----triggering a repaint...");
repaint();
}
}以下是调用runApp方法时四个测试浏览器中每个浏览器的最后几行Java:
IE9(测试版)- works:
basic: Applet启动 basic:告诉客户端applet已经启动。 -绘画 -运行应用程序: notepad.exe -绘画
Safari 5.0.2 (7533.18.5) -失败
liveconnect: JavaScript:默认安全策略= -运行应用程序: notepad.exe
Opera 10.62 - works
basic: Applet启动 basic:告诉客户端applet已经启动。 -绘画 -绘画 -绘画 -运行应用程序: notepad.exe -绘画
Chrome 6.0.472.63 -失败
basic: Applet启动 basic:告诉客户端applet已经启动。 -运行应用程序: notepad.exe
请让我知道,如果你能想到任何原因,这是为什么这是不一贯的(或更好的方式来做这一点)。我还应该指出,我尝试过直接从runApp调用启动进程,但这是普遍失败的。
发布于 2010-10-08 15:00:27
也许这个链接给出了一些提示。例如:
注意:如果在处理初始重绘请求之前,在组件上发生了多次重绘()调用,则可能将多个请求折叠到一个调用update()中。确定何时应折叠多个请求的算法依赖于实现。如果折叠了多个请求,则生成的更新矩形将等于折叠请求中包含的矩形的合并。
您可能需要检查applet是否可见,最近是否有油漆,以及update(图形)是否被调用.
https://stackoverflow.com/questions/3884665
复制相似问题