![](/img/trans.png)
[英]Open java Applet or Frame inside a parent Applet method and wait for input
[英]Draw on top of an Applet inside a Frame
我正在尝试创建一个Applet加载器,我需要在显示的Applet上绘制,但我似乎无法找到一种方法来做到这一点。
我最初的理解是Applet,通过扩展Component就像任何常规的java.awt.Component一样,可以在Container中添加,只有覆盖paint方法,但它似乎不起作用。
在我的初始化代码中,我创建了一个java.awt.Frame,我在其上添加了我的java.awt.Container的自定义实现,它覆盖了所有的paint方法,以便它们在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本身,因为它是一个仅以二进制形式提供的遗留组件。 我知道有一个通过字节码修改的解决方案,但由于Applets的种类繁多,这是不可能的。
这是因为applet重叠容器的drawaple区域。 如果设置applet的背景颜色并更改大小,您可以看到这一点:
applet.setBackground(Color.RED);
applet.setBounds(0, 0, 12, 12);
结果我们可以在applet上绘制的黑色方块下看到红色边框(applet的背景):
使用applet大小和applet的红色背景完全重叠容器可绘制区域:
如果将Applet
更改为Component
,则可以从容器中看到黑色方块,因为Component
类没有背景。 即改变applet变量的类型:
Component applet = new Component() {
//...
};
applet.setBackground(Color.RED);
您可以在实验中看到图片:
为了能够在其父容器上绘制Applet,需要采取哪些步骤?
除了直接在applet上绘图外,在applet上绘制是不可能的。
使用GlassPane无法解决applet的这个问题。 我试过文档中的例子
并替换代码:
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);
结果我们可以看到applet,owerlap darawed circle:
如果我们将applet变量的类型更改为JLanel
,则完全绘制圆。
正如谢尔盖所说,你的Applet
与你的Container
重叠,因为它有一个背景,你看不到Container
上的彩绘矩形。 但是,据我所知,无法将此背景设置为透明色。 您可以在此处和此处查看讨论该主题和可能解决方案的这些帖子。
当你可以改变applet
代码但不能改变applet
类型的情况时,最好的方法
import java.applet.Applet;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
@SuppressWarnings("serial")
public class AppletTest {
public static void main(String[] args) {
Frame frame = new Frame("Applet Test");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
frame.dispose();
}
});
int apHeight = 50;
int apWidth = 50;
Container container = new Container() {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D graphs = (Graphics2D) g;
graphs.setBackground(Color.WHITE);
graphs.clearRect(0, 0, apWidth, apHeight);
g.setColor(Color.RED);
g.fillRect(5, 5, 10, 10);
}
};
Dimension dimension = new Dimension(50, 50);
container.setPreferredSize(dimension);
frame.add(container);
frame.pack();
frame.setVisible(true);
BufferedImage bufImage = new BufferedImage(dimension.width, dimension.height, BufferedImage.TYPE_INT_RGB);
container.paint(bufImage.createGraphics());
Applet applet = new Applet() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(bufImage, 0, 0, this);
g.fillRect(0, 0, 10, 10);
}
};
container.add(applet);
applet.setBounds(0, 0, apWidth, apHeight);
applet.init();
}
}
输出如下所示。
编辑澄清问题
如果您正在从文件中读取,最好的方法是声明您的applet,创建一个图像,然后将图像绘制到applet上。 我做了一个示例,生成二进制文件,然后从中读取对象。 之后它会在上面绘制背景。
import java.applet.Applet;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@SuppressWarnings("serial")
public class AppletTest {
private static void createBinaryApplet() throws IOException {
Applet applet = new Applet() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("applet.dat"));
oos.writeObject(applet);
oos.close();
}
public static void main(String[] args) {
Frame frame = new Frame("Applet Test");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
frame.dispose();
}
});
final int prefHeight = 50;
final int prefWidth = 50;
Container container = new Container() {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D graphs = (Graphics2D) g;
graphs.setBackground(Color.WHITE);
graphs.clearRect(0, 0, prefWidth, prefHeight);
g.setColor(Color.RED);
g.fillRect(5, 5, 10, 10);
}
};
container.setPreferredSize(new Dimension(prefWidth, prefHeight));
frame.add(container);
frame.pack();
frame.setVisible(true);
BufferedImage bufImage = new BufferedImage(prefWidth, prefHeight, BufferedImage.TYPE_INT_RGB);
container.paint(bufImage.createGraphics());
try {
createBinaryApplet();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("applet.dat"));
Applet applet = (Applet) ois.readObject();
ois.close();
container.add(applet);
applet.setBounds(0, 0, prefWidth, prefHeight);
applet.init();
Graphics g = applet.getGraphics();
g.drawImage(bufImage, 0, 0, applet);
applet.paint(g);
} catch(ClassNotFoundException | IOException e) {
System.out.println("Whoops");
}
}
}
这产生与以前相同的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.