insertar ejemplos java swing applet awt

java - insertar - applet html ejemplos



Dibuja sobre un Applet dentro de un Frame (2)

Estoy tratando de crear un cargador de Applet y necesito dibujar sobre el Applet que se muestra, sin embargo, parece que no puedo encontrar una manera de hacerlo.

Mi comprensión original fue que Applet, al extender Component, es como cualquier componente java.awt.normal que se puede agregar dentro de Container que solo tiene un método de pintura anulado, pero parece que no está funcionando.

En mi código de inicialización creo un java.awt.Frame en el que agrego mi implementación personalizada de java.awt.Container que ha anulado todos los métodos de pintura para que llenen rect at x: 5, y: 5 con tamaño w: 10 , h: 10 después de llamar al método padre

Sin embargo, cuando se agrega el applet, siempre, sin importar qué se dibuje encima de todo

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(); } }

¿Cuáles son los pasos que se deben seguir para poder dibujar sobre el Applet desde su Container primario?

Aquí también hay una captura de pantalla del resultado de ejecutar el código anterior

Sin embargo, si cambio el tipo de applet a Component como

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

el resultado es correcto

Las limitaciones de la solución requerida es que no puedo modificar el Applet en sí, ya que es un componente heredado que solo se proporciona como binario. Sé que hay una solución al hacer modificaciones en los códigos de bytes, pero debido a los muchos sabores de los Applets, eso está fuera de cuestión.


Por qué el contenedor cuadrado no es visible

Sucede debido a la superposición de applet drawaple área del contenedor. Puede ver esto, si el color de fondo de configuración del applet y el tamaño de cambio:

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

Como resultado, podemos ver el borde rojo (fondo del applet) debajo del cuadrado negro dibujado en el applet:

Con el tamaño de su applet y con el fondo rojo del applet, superponga completamente el área dibujable del contenedor:

Si cambia de Applet a Component , puede ver el cuadrado negro del contenedor debido a que el Component de clase no tiene fondo. Es decir, cambiar el tipo de variable de applet:

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

Puedes ver la imagen como en tu experimento:

Dibujando en la parte superior del applet

¿Cuáles son los pasos que se deben seguir para poder dibujar sobre el applet desde su contenedor primario?

No es posible dibujar encima del applet, excepto dibujar directamente en el applet.

El uso de GlassPane no resuelve este problema para los applets. Intenté el ejemplo de la documentación

y reemplazar el código:

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

a:

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);

En resultado, podemos ver el applet, que tiene un círculo de trazos de owerlap:

El círculo está completamente dibujado, si cambiamos el tipo de variable de applet a JLanel .


Como Sergey dijo que tu Applet superpone a tu Container y como tiene un fondo, no puedes ver el rectángulo pintado en el Container . Sin embargo, hasta donde yo sé, no es posible establecer este fondo en un color transparente. Puede ver estas publicaciones, aquí y aquí , que discuten el tema y una posible solución.

La mejor manera para una situación para cuando puede cambiar el código del applet pero no puede cambiar el tipo de 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(); } }

El resultado de esto se parece a lo siguiente.

Editar para una pregunta aclarada
Si está leyendo desde un archivo, la mejor manera sería declarar su applet, crear una imagen y luego pintar la imagen en el applet. Hice un ejemplo que hace un archivo binario y luego lee el objeto de él. Después de lo cual pinta el fondo en él.

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"); } } }

Esto produce el mismo resultado que antes.