Tengo un JPanel al que me gustaría añadir imágenes JPEG y PNG que genero sobre la marcha.
Todos los ejemplos que he visto hasta ahora en los Tutoriales de Swing, especialmente en los Ejemplos de Swing utilizan ImageIcon
s.
Yo' estoy generando estas imágenes como matrices de bytes, y suelen ser más grandes que el icono común que usan en los ejemplos, a 640x480.
Edición: Un examen más cuidadoso de los tutoriales y de la API muestra que no se puede añadir un ImageIcon directamente a un JPanel. En su lugar, logran el mismo efecto estableciendo la imagen como un icono de un JLabel. Esto no parece correcto...
Aquí'es cómo lo hago (con un poco más de información sobre cómo cargar una imagen):
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{
private BufferedImage image;
public ImagePanel() {
try {
image = ImageIO.read(new File("image name and path"));
} catch (IOException ex) {
// handle exception...
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters
}
}
ImageIcon
s. Para una sola imagen, pensaría en hacer una subclase personalizada de JPanel
y sobrescribir su método paintComponent
para dibujar la imagen.Puedes subclasificar JPanel - aquí hay un extracto de mi ImagePanel, que pone una imagen en cualquiera de las 5 ubicaciones, arriba/izquierda, arriba/derecha, medio/centro, abajo/izquierda o abajo/derecha:
protected void paintComponent(Graphics gc) {
super.paintComponent(gc);
Dimension cs=getSize(); // component size
gc=gc.create();
gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2) +mmHrzShift),(((cs.height-mmSize.height)/2) +mmVrtShift),null); }
if(tlImage!=null) { gc.drawImage(tlImage,(insets.left +tlHrzShift),(insets.top +tlVrtShift),null); }
if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top +trVrtShift),null); }
if(blImage!=null) { gc.drawImage(blImage,(insets.left +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
}