2013-03-10 2 views
2

Я написал свой собственный ImagePanel, используя одну из предыдущих тем здесь:Показаны изображения с помощью JPanel

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 

public class ImagePanel extends JPanel{ 

    private BufferedImage image = null; 

    public ImagePanel(BufferedImage im) { 
     image = im; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null);    
    } 
} 

И тогда я подумал, что было бы неплохо добавить эту панель на нормальных JPanel (было бы легче поместите его на фрейм, используя все это все вещи NetBeans). Поэтому я добавил один, NetBeans генерироваться мне код: private javax.swing.JPanel pnlImagePanel; И вот наступает момент, когда я хотел бы показать изображение, так:

File selectedFile = new File(path); 
try { 
     image = ImageIO.read(selectedFile); 
} catch(IOException ex) { 
     throw new RuntimeException(ex); 
} 
ImagePanel imPanel = new ImagePanel(image); 
this.pnlImagePanel = imPanel; 
this.pnlImagePanel.repaint(); 

Проблема очевидна - я не получил никакого результата. Разве это не работает? Я переоценил метод paintComponent, поэтому полиморфизм должен срабатывать. Или что-то мне не хватает?

ответ

6

Просто присвоение переменной-члена pnlImagePanel к вашему ImagePanel не будет работать, вам придется добавить панель в JPanel контейнере:

pnlImagePanel.add(imPanel); 

Вы должны будете дать imPanel размер так, чтобы изображение можно увидеть. Самый простой подход - использовать диспетчер компоновки, который позволяет дочерней панели занимать максимальную площадь. Вместо того, чтобы по умолчанию FlowLayout, вы могли бы использовать GridLayout:

pnlImagePanel.setLayout(new GridLayout()); 

Вызов repaint ненужно здесь. Механизм цепочки окраски гарантирует, что ваши панели будут окрашены.

+0

Вы имели в виду 'pnlImagePanel.add (imPanel)'. Но да, это сработало. Благодарю. – Fuv

+0

Yw, только что скорректировал, что b4 вы упомянули :)) – Reimeus

2

Override getPrefferedSize() в ImagePanel вернуть размер изображения, то есть:

@Override 
    public Dimension getPreferredSize() { 
     if (image == null) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(image.getWidth(this), image.getHeight(this)); 
    } 

И, да, не забудьте добавить панель изображения в контейнер, как было предложено @Reimeus. +1 к нему.

1
import java.awt.BorderLayout; 
import java.awt.Graphics; 
import javax.swing.ImageIcon; 

/** 
* imagePanel 
* @author zhangqi [email protected] 
* @date Jan 10, 2013 4:45:05 PM 
* @version V1.0 
*/ 
public class ImagePanel extends JPanel 
{ 

    private static final long serialVersionUID = 1L; 
    private BorderLayout borderLayout = new BorderLayout(); 
    private ImageIcon image = null; 

    public ImagePanel(ImageIcon image) 
    { 
     this.image = image; 
     this.setLayout(borderLayout); 
    } 

    protected void paintComponent(Graphics g) 
    { 
     setOpaque(true); 
     super.paintComponent(g); 
     if (image != null) 
      g.drawImage(image.getImage(), 0, 0, this.getWidth(), 
        this.getHeight(), this); 
    } 

    public ImageIcon getImage() 
    { 
     return image; 
    } 

    public void setImage(ImageIcon image) 
    { 
     this.image = image; 
    } 
}