Я пытаюсь создать загрузчик апплета, и мне нужно рисовать поверх отображаемого апплета, однако я не могу найти способ сделать это.
Мое первоначальное понимание заключалось в том, что Applet, расширяя Component, точно так же, как и любой обычный java.awt.Component, который можно добавить внутри контейнера, который просто переопределяет метод рисования, но кажется, что он не работает.
В моем коде инициализации я создаю 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
?
Вот также скриншот результата выполнения приведенного выше кода
Если я, однако, изменяю тип Applet
на Component
, например
Component applet = new Component() {
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 10, 10);
}
};
правильный результат
Ограничения требуемого решения заключаются в том, что я не могу изменить сам Applet, как его устаревший компонент, который предоставляется только как двоичный. Я знаю, что есть решение, сделав модификацию байт-кода, но из-за многих вкусов апплетов это не может быть и речи.