Ich habe ein JPanel, zu dem ich gerne JPEG- und PNG-Bilder hinzufügen möchte, die ich on the fly generiere.
Alle Beispiele, die ich bisher in den Swing Tutorials gesehen habe, insbesondere in den Swing Beispielen verwenden ImageIcon
s.
Ich generiere diese Bilder als Byte-Arrays, und sie sind normalerweise größer als das übliche Icon, das in den Beispielen verwendet wird, nämlich 640x480.
Edit: Eine genauere Untersuchung der Tutorials und der API zeigt, dass man ein ImageIcon nicht direkt zu einem JPanel hinzufügen kann. Stattdessen wird der gleiche Effekt erreicht, indem das Bild als Icon eines JLabels gesetzt wird. Das fühlt sich einfach nicht richtig an...
Hier ist, wie ich es mache (mit ein wenig mehr Informationen darüber, wie man ein Bild lädt):
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
verwenden. Für ein einzelnes Bild würde ich darüber nachdenken, eine eigene Unterklasse von JPanel
zu erstellen und deren paintComponent
Methode zu überschreiben, um das Bild zu zeichnen.Sie können JPanel subclass - hier ist ein Auszug aus meinem ImagePanel, die ein Bild in einer von 5 Positionen, oben / links, oben / rechts, Mitte / Mitte, unten / links oder unten / rechts setzt:
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); }
}