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