JPanel'e nasıl resim eklenir?

Anında oluşturduğum JPEG ve PNG görüntülerini eklemek istediğim bir JPanel var.

Şimdiye kadar Swing Tutorials'de, özellikle Swing examples'de gördüğüm tüm örnekler ImageIcon kullanıyor.

Bu görüntüleri bayt dizileri olarak oluşturuyorum ve genellikle örneklerde kullandıkları 640x480 boyutundaki ortak simgeden daha büyük oluyorlar.

  1. Bir JPanel'de bu boyuttaki bir resmi görüntülemek için ImageIcon sınıfını kullanmanın herhangi bir (performans veya başka) sorunu var mı?
  2. Bunu yapmanın olağan yolu nedir?
  3. ImageIcon sınıfını kullanmadan bir JPanel'e nasıl resim eklenir?

Edit: Eğitimlerin ve API'nin daha dikkatli bir incelemesi, bir JPanel'e doğrudan bir ImageIcon ekleyemeyeceğinizi göstermektedir. Bunun yerine, görüntüyü bir JLabel'in simgesi olarak ayarlayarak aynı etkiyi elde ederler. Bu sadece doğru gelmiyor...

Çözüm

İşte bunu nasıl yaptığım (bir görüntünün nasıl yükleneceği hakkında biraz daha fazla bilgi ile):

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            
    }

}
Yorumlar (7)
  1. Herhangi bir sorun olmamalıdır (çok büyük resimlerle yaşayabileceğiniz genel sorunlar dışında).
  2. Eğer tek bir panele birden fazla resim eklemekten bahsediyorsanız, ben olsam ImageIcon kullanırdım. Tek bir resim için, JPanelin özel bir alt sınıfını oluşturmayı ve resmi çizmek için paintComponent yöntemini geçersiz kılmayı düşünürdüm.
  3. (bkz. 2)
Yorumlar (0)

JPanel alt sınıfını kullanabilirsiniz - burada, bir görüntüyü üst/sol, üst/sağ, orta/orta, alt/sol veya alt/sağ olmak üzere 5 konumdan herhangi birine yerleştiren ImagePanel'imden bir alıntı var:

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