gpt4 book ai didi

java - 在 Frame 内的 Applet 顶部绘制

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:33 26 4
gpt4 key购买 nike

我正在尝试创建一个 Applet 加载器,我需要在显示的 Applet 上进行绘制,但我似乎找不到这样做的方法。

我最初的理解是,Applet 通过扩展 Component 就像任何常规的 java.awt.Component 一样,可以添加到 Container 中,只是重写了 paint 方法,但它似乎不起作用。

在我的初始化代码中,我创建了一个 java.awt.Frame,我在其上添加了我的 java.awt.Container 的自定义实现,它覆盖了所有绘制方法,以便它们在 x: 5、y:5 处填充矩形,大小为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();


}

}

需要采取哪些步骤才能在 Applet 的父 Container 之上绘制?

这里也是上面代码运行结果的截图

![enter image description here

但是,如果我将 applet 的类型更改为 Component,例如

Component applet = new Component() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};

结果正确

enter image description here

所需解决方案的局限性在于我无法修改 Applet 本身,因为它是仅以二进制形式提供的遗留组件。我知道有一个通过修改字节码的解决方案,但由于 Applet 的种类繁多,这是不可能的。

最佳答案

为什么容器正方形不可见

发生这种情况是因为 applet 与容器的 drawaple 区域重叠。你可以看到这个,如果设置小程序的背景颜色并改变大小:

applet.setBackground(Color.RED);
applet.setBounds(0, 0, 12, 12);

在结果中我们可以看到在小程序上绘制的黑色方 block 下有红色边框(小程序的背景):

Part overlap

用你的小程序大小和小程序的红色背景完全覆盖容器可绘制区域:

Full overlapp

如果将 Applet 更改为 Component,您可以从容器中看到黑色方 block ,因为类 Component 没有背景。 IE。更改小程序变量的类型:

Component applet = new Component() {
//...
};
applet.setBackground(Color.RED);

您可以看到实验中的图像:

Component no background

在小程序上绘图

What are the steps that are needed to be taken to be able to draw on top of the Applet from its parent Container?

除了直接在小程序上绘制外,不能在小程序上绘制。

使用 GlassPane不解决小程序的这个问题。我试过 example来自文档

Documentation example

并替换代码:

contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("Button 2"));

到:

Applet applet = new Applet() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};
applet.setPreferredSize(new Dimension(100, 25));
applet.setBackground(Color.GREEN);
contentPane.add(applet);

在结果中我们可以看到小程序,它重叠成一个圆圈:

Glasspane overlaped

如果我们将 applet 变量的类型更改为 JLanel,则圆已完全绘制。

Glasspane draw full circle

关于java - 在 Frame 内的 Applet 顶部绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41553382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com