【问题标题】:java applet not responding to repaint request in webkit browsersjava小程序没有响应webkit浏览器中的重绘请求
【发布时间】: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


【解决方案1】:

也许这个link 给出了一些提示。例如:

注意:如果在处理初始重绘请求之前在一个组件上发生了多次对 repaint() 的调用,则多个请求可能会合并为对 update() 的单个调用。确定何时应该折叠多个请求的算法取决于实现。如果折叠多个请求,则生成的更新矩形将等于折叠请求中包含的矩形的并集。

您可能想检查小程序是否可见、最近是否有绘画以及是否调用了 update(Graphics)...

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2015-01-23
    相关资源
    最近更新 更多