如何控制使用ClassLoader加载的画布



假设我使用UrlClassLoader从网站加载小程序,并将其作为组件附加到框架。我如何才能控制画布,以便自己绘制?据我所知,这方面的信息并不多。有人提到了一些关于XBOOTING的东西,但我不知道那是什么,也找不到任何关于它的信息。

问题是"每个小程序都不一样"。例如,该小程序中没有Canvas,而是直接绘制到小程序表面。一旦您有了小程序的实例,您就可以直接绘制到该实例,但在用户选择按钮的那一刻,它就会被覆盖。

import java.applet.Applet;
import java.awt.*;
import java.net.*;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class GrabThatCanvas {
    GrabThatCanvas() {
        try {
            String string = "http://mainline.brynmawr.edu/Courses/cs110/spring2002/Applets/Smiley/";
            URL[] urls = {
                    new URL(string)
            };
            URLClassLoader urlcl = new URLClassLoader(urls);
            Class<?> clss = urlcl.loadClass("Smiley");
            Object o = clss.newInstance();
            Applet applet = (Applet)o;
            applet.init();
            applet.start();
            applet.setPreferredSize(new Dimension(200,200));
            Canvas canvas = findFirstCanvas(applet);
            if (canvas!=null) {
                System.out.println("We have the Canvas!");
            } else {
                System.out.println("No Canvas found!");
            }
            JOptionPane.showMessageDialog(null, applet);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /* Very naive implementation that assumes the canvas is added
     * directly to the applet. */
    public Canvas findFirstCanvas(Container parent) {
        Canvas canvas = null;
        Component[] components = parent.getComponents();
        for (Component c : components) {
            System.out.println(c);
            if (c instanceof Canvas) {
                canvas = (Canvas)c;
                break;
            }
        }
        return canvas;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GrabThatCanvas();
            }
        });
    }
}

输出

java.awt.Button[button0,0,0,0x0,invalid,label=Smile]
java.awt.Button[button1,0,0,0x0,invalid,label=Sad]
No Canvas found!

当然,您可以将小程序放在Swing GUI中,考虑Swing和AWT的奇怪组合,并使用分层窗格绘制整个小程序的"顶部"。但这带来了新的问题。

最新更新