0

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

4

1 回答 1

2

问题是“每个小程序都不同”。 例如,该小程序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 的奇怪组合,并使用分层窗格在整个小程序的“顶部”绘制。但这带来了新的问题。

于 2012-08-04T22:57:47.343 回答