【发布时间】:2017-01-19 10:31:30
【问题描述】:
我正在尝试创建一个 Applet 加载程序,我需要在显示的 Applet 上进行绘制,但是我似乎找不到这样做的方法。
我最初的理解是,Applet 通过扩展 Component 就像任何可以添加到 Container 中的常规 java.awt.Component 一样,只是具有覆盖的paint方法,但它似乎不起作用。
在我的初始化代码中,我创建了一个 java.awt.Frame,在该框架上添加了我的 java.awt.Container 的自定义实现,该实现覆盖了所有绘制方法,以便它们在 x: 5, y:5 处填充 rect 的大小w:10, h:10 调用父方法后
但是,当添加小程序时,它总是,无论在所有内容之上绘制什么
public class AppletTest {
public static void main(String[] args) {
Frame frame = new Frame("Applet Test!");
Container container = new Container() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void paintAll(Graphics g) {
super.paintAll(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void paintComponents(Graphics g) {
super.paintComponents(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void print(Graphics g) {
super.print(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void printComponents(Graphics g) {
super.printComponents(g);
g.fillRect(5, 5, 10, 10);
}
@Override
public void update(Graphics g) {
super.update(g);
g.fillRect(5, 5, 10, 10);
}
};
Dimension dimension = new Dimension(50, 50);
container.setPreferredSize(dimension);
Applet applet = new Applet() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};
container.add(applet);
applet.setBounds(0, 0, 50, 50);
frame.add(container);
frame.pack();
frame.setVisible(true);
applet.init();
applet.start();
}
}
需要采取哪些步骤才能在其父 Container 的 Applet 之上进行绘制?
这也是上面代码运行结果的截图
如果我将applet 的类型更改为Component,例如
Component applet = new Component() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};
结果正确
所需解决方案的局限性在于我无法修改 Applet 本身,因为它是一个仅以二进制形式提供的遗留组件。我知道通过修改字节码可以解决问题,但是由于 Applet 的风格很多,所以这是不可能的。
【问题讨论】:
-
1) “我正在尝试创建一个 Applet 加载器..” 为什么? “..我需要借鉴显示的小程序顶部” 考虑使用
JLayeredPane。 2) 如需更好的帮助,请发帖minimal reproducible example。 -
1) 我正在尝试创建一个层来扩展遗留的 Java 二进制小程序,并希望尽可能地保持类似于 swing 的“API”,我的意思是......这就是它应该如何工作的?您将一个组件添加到一个容器并且容器绘制了孩子,但是对于 Applets,它似乎并非如此.. 2)我发布的代码是最小的、完整的和可验证的,我不知道我能做的任何其他事情撕掉代码..它创建一个框架,向其中添加一个绘制矩形的容器,在该容器上添加一个小程序也绘制一个矩形..我还发布了当前和预期的运行结果..
-
@AndrewThompson 是 MCVE...!?。这个目标可能是有问题的,但不管怎样,这是一个有趣的小故障。我尝试了不同的组件,并添加了打印语句(在
super调用之后)。如果组件是Container,那么它会打印"Paint component, paint container",并且它可以工作。如果组件是Panel,那么它会打印"Paint container, paint component",并且不工作。但是Panel类中不应该有任何会导致 such 不同行为的内容。我没有投入太多时间,但很想知道发生了什么 -
确实非常奇怪的行为!我很肯定这与 Applet 沙盒有关。我将调试器附加到 Applet 的 onPaint 方法,堆栈跟踪显示它不是由父组件绘制的,而是由一些接收到的 RepaintArea 绘制的重绘活动.. 感谢您抽出宝贵时间!
-
您是否可以接受 Sergey 的当前答案,或者您是否正在寻找替代方案(以及对奇怪行为的可能解释)?