【发布时间】:2010-10-07 18:27:31
【问题描述】:
我目前正在编写一个小型 Java 小程序,以以浏览器中立的方式解决我们公司内部网中的特定问题。这过去是通过 ActiveX 完成的,但我们希望让人们远离 IE。该代码显然对公众消费不安全,但在受控情况下很有用。本质上,我希望用户能够单击他们的链接并根据从 AJAX 调用返回的数据打开安装在本地计算机上的应用程序。这是一个签名的 Java 小程序,并且证书已在本地机器上被接受。
目前这在 IE 和 Opera 中完美运行,但在 Chrome 和 Safari 中失败。看来 repaint() 方法实际上并没有导致重绘,我正在努力解决这个问题。这是小程序代码:
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(测试版)- 有效:
基本:小程序启动
基本:告诉客户小程序已启动
-----绘画
-----正在运行的应用程序:notepad.exe
-----触发重绘...
-----绘画
Safari 5.0.2 (7533.18.5) - 失败
liveconnect:JavaScript:默认安全策略 =
-----正在运行的应用程序:notepad.exe
-----触发重绘...
Opera 10.62 - 工作
基本:小程序启动
基本:告诉客户小程序已启动
-----绘画
-----绘画
-----绘画
-----正在运行的应用程序:notepad.exe
-----触发重绘...
-----绘画
Chrome 6.0.472.63 - 失败
基本:小程序启动
基本:告诉客户小程序已启动
-----正在运行的应用程序:notepad.exe
-----触发重绘...
如果您能想出导致这种行为不一致的任何原因(或总体上更好的方法),请告诉我。我还应该指出,我曾尝试直接从 runApp 调用启动该进程,但这普遍失败。
【问题讨论】:
-
如果我没有记错我作为applet 程序员的日子,调用repaint() 并不能保证调用paint()。从 paint() 方法运行另一个程序似乎也是一种 hack。我认为最好看看为什么“直接从 runApp 调用启动进程,但普遍失败”并更直接地解决问题。
-
我应该提到我检查了 java 文档以进行重绘,看来它不能保证它会及时调用paint(除非您使用需要最大延迟的重载)。我已经尝试了两个版本,但它们都不起作用。不过,关于黑客部分,你是对的,我会继续深入研究,但感觉我已经完成了一半。
标签: java browser applet webkit