Имам панел JPanel, към който искам да добавям JPEG и PNG изображения, които генерирам в движение.
Всички примери, които съм виждал досега в Swing Tutorials, и специално в Swing examples, използват ImageIcon
s.
Аз генерирам тези изображения като масиви от байтове и те обикновено са по-големи от обикновената икона, която се използва в примерите, с размери 640x480.
Едит: По-внимателно разглеждане на уроците и API показва, че не можете да добавяте ImageIcon директно към JPanel. Вместо това те постигат същия ефект, като задават изображението като икона на JLabel. Това просто не е правилно...
Ето как го правя аз (с малко повече информация за това как се зарежда изображение):
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. За единично изображение бих помислил за създаване на потребителски подклас на JPanel
и надписване на неговия метод paintComponent
за рисуване на изображението.Можете да създадете подклас JPanel - ето извлечение от моя ImagePanel, който поставя изображение на едно от 5 места: горе/вляво, горе/вдясно, в средата/по средата, долу/вляво или долу/вдясно:
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); }
}