使用JPanel显示图像

Fuv*_*Fuv 2 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);            
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我认为在普通的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();
Run Code Online (Sandbox Code Playgroud)

问题很明显 - 我没有结果.不应该工作吗?我已经覆盖了paintComponent方法,因此应该触发多态.或者是我缺少的东西?

Rei*_*eus 6

只需将一个成员变量分配pnlImagePanel给您的ImagePanel工作就不起作用,您必须将面板添加到JPanel容器中:

pnlImagePanel.add(imPanel);
Run Code Online (Sandbox Code Playgroud)

您需要提供imPanel一个尺寸,以便可以看到图像.最简单的方法是使用允许子面板占据最大区域的布局管理器.FlowLayout您可以使用GridLayout以下方法而不是默认值:

pnlImagePanel.setLayout(new GridLayout());
Run Code Online (Sandbox Code Playgroud)

repaint这里不需要打电话.油漆链机制将确保您的面板被涂漆.