假设我使用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的奇怪组合,并使用分层窗格绘制整个小程序的"顶部"。但这带来了新的问题。