Java 使用JPanel显示图像
我使用前面的主题之一编写了自己的ImagePanel:Java 使用JPanel显示图像,java,swing,jpanel,preferredsize,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) {
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,因此应该激发多态性。或者我缺少什么?仅将成员变量pnlImagePanel
分配给ImagePanel
将不起作用,您必须将该面板添加到JPanel
容器中:
pnlImagePanel.add(imPanel);
您需要给imPanel
一个大小,以便可以看到图像。最简单的方法是使用允许子面板占据最大面积的布局管理器。您可以使用GridLayout
,而不是默认的FlowLayout
:
pnlImagePanel.setLayout(new GridLayout());
这里不需要调用repaint
。绘制链机制将确保您的面板已绘制。在ImagePanel
中覆盖getPreferedSize()
以返回图像大小,即:
@Override
public Dimension getPreferredSize() {
if (image == null) {
return super.getPreferredSize();
}
return new Dimension(image.getWidth(this), image.getHeight(this));
}
是的,别忘了按照@Reimeus的建议将图像面板添加到容器中+我向他道歉 你的意思是pnlImagePanel.add(imPanel)
。但是是的,它起作用了。谢谢
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;
}
}