0

我想在面板内显示图像。所以我将图像的路径传递给该方法,打开图像文件并将其传递给专用于在面板内绘制图像的私有类的方法。问题是面板一直是空的并且不显示任何内容。

这是代码:

JPanel ImagePane; // I want to add image to this

public void getImagePath(String Path)
{       
    BufferedImage image = null;

    try 
    {
        image=ImageIO.read(new File(Path));
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    DisplayImage display= new DisplayImage();
    display.getImage(image);
}

private class DisplayImage extends JPanel
{
    private BufferedImage image=null;

    public void getImage(BufferedImage im)
    {
        image=im;
        repaint();
    }

    public void paintComponents(Graphics g)
    {
        g.drawImage(image, 0, 0, image.getWidth() /2, image.getHeight()/2,ImagePane);
    }
}

我错过了什么?

4

3 回答 3

5

paintComponents是一种Container用于绘制容器中每个组件的方法。相反,您需要paintComponent绘制这个单个组件。

改变你的

public void paintComponents(Graphics g)

方法

@Override
public void paintComponent(Graphics g) {
   super.paintComponent(g);
   g.drawImage(image, 0, 0, image.getWidth() /2, image.getHeight()/2,ImagePane);
}

请注意使用@Override注解来帮助检查方法签名。

也叫

super.paintComponent(g);

将更新子组件。


在您的方法getImagePath中,您似乎没有将其添加DisplayImage到任何容器中。相反,您创建一个 local DisplayImage,但不要使用它。

于 2013-01-22T12:35:49.033 回答
3

你必须覆盖paintComponent

 protected void paintComponent(Graphics g)

但是在您创建的代码中public void paintComponents(Graphics g),这是不正确的

于 2013-01-22T12:38:03.103 回答
2

@Override注释的使用。如果您习惯于在重写方法时使用它,则可以在编译时解决此问题。你需要使用这个:

    @Override 
    public void paintComponent(Graphics g)
于 2013-01-22T12:41:07.403 回答