使用JPanel显示图像

时间:2013-03-10 16:29:32

标签: java swing jpanel preferredsize

我已经使用以前的主题编写了我自己的ImagePanel:

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方法,因此应该触发多态。或者是我不想要的东西?

3 个答案:

答案 0 :(得分:6)

只是将成员变量pnlImagePanel分配给ImagePanel将无效,您必须面板添加到JPanel容器中:

pnlImagePanel.add(imPanel);

您需要为imPanel提供一个尺寸,以便能够看到图像。最简单的方法是使用允许子面板占据最大区域的布局管理器。您可以使用FlowLayout

,而不是默认GridLayout
pnlImagePanel.setLayout(new GridLayout());

此处不需要呼叫repaint。油漆链机制将确保您的面板被涂漆。

答案 1 :(得分:2)

覆盖getPrefferedSize()中的ImagePanel以返回图片大小,即:

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

并且,是的,不要忘记按照@Reimeus的建议将图像面板添加到容器中。 +1给他。

答案 2 :(得分:1)

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

/**
 * imagePanel
 * @author zhangqi hizhangqi@yahoo.com
 * @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;
    }
}