我目前有一个小的Java小程序,我正在编写,以浏览器中立的方式解决我们公司内部网中的特定问题 . 这曾经是用ActiveX完成的,但我们想让人们离开IE . 该代码对于公共消费显然是不安全的,但在受控环境下它是有用的 . 基本上我希望用户能够根据AJAX调用返回的数据单击其中的链接并打开安装在本地计算机上的应用程序 . 这是一个已签名的Java小程序,并且该证书已在本地计算机上接受 .
目前,这在IE和Opera中完美运行,但在Chrome和Safari中失败了 . 似乎repaint()方法实际上并没有导致重绘,我正在努力 . 这是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控制台的最后几行:
IE 9 (beta) - works:
基本:Applet开始基本:Told客户端applet启动-----绘画-----运行app:notepad.exe -----触发重绘...... -----绘画
Safari 5.0.2 (7533.18.5) - fails
liveconnect:JavaScript:默认安全策略= -----运行应用程序:notepad.exe -----触发重绘...
Opera 10.62 - works
基本:Applet开始基本:Told客户端applet启动-----绘画-----绘画-----绘画-----运行app:notepad.exe -----触发重绘 . .. -----绘画
Chrome 6.0.472.63 - fails
基本:Applet开始基本:Told客户端applet启动-----运行app:notepad.exe -----触发重绘...
如果您能够想到为什么这种行为不一致(或者更好的方式来执行此操作),请告诉我 . 我还应该指出,我已尝试直接从runApp调用启动该过程,但这种情况无法实现 .
1 回答
也许这个link提供了一些提示 . 例如:
您可能想要检查applet是否可见,最近是否有绘制,以及是否调用了update(Graphics)...