有没有理由drawImage实际上不会绘制图像?

时间:2014-04-27 05:09:44

标签: java drawimage

private void renderLevelBackground(Graphics2D g2) {
    Image backgroundImage = model.getBackgroundImage();

    g2.drawImage(backgroundImage, 0, 0, null);
}

这是我的代码,我知道backgroundImage已正确加载,因为如果我得到了Width / Height,它会给我正确的值。无论如何都要测试它是否是图像,或者它是否以某种方式表示方法?尽管我已经在这个项目中多次使用了drawImage方法,但它只是在我的屏幕上画画,所有这些都完美无瑕地工作。

由于

2 个答案:

答案 0 :(得分:3)

  

“有没有理由说drawImage实际上不会绘制图像?”

可能性,由于提供了错误的路径,因此没有图像。使用ImageIO.read(),如果找不到图像文件,将导致异常。例如

public class ImagePanel extends JPanel {
    private BufferedImage image;

    public ImagePanel() {
        try {
            image = ImageIO.read(getClass().getResource("/resources/image.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

如果找不到图像,则会抛出IO异常。


可能性,您要绘制的面板没有首选大小(0 x 0),并且您要为其添加一个符合首选大小的容器机智布局,因此{{1}将无法显示图像。例如

ImagePanel

要解决此问题,您可以覆盖public class ImagePanel extends JPanel { protected void paintComponent(...) { ... } JPanel panel = new JPanel(); // default FlowLayout that respects preferred sizes panel.add(new ImagePanel());

gerPreferredSize()
ImagePanel

可能性,您没有在public class ImagePanel extends JPanel { @Override public Dimension getPreferredSize() { return new Dimension(300, 300); } } 方法的图形上下文中调用您的方法。

paint[Component]

除此之外,这些都只是猜测,你应该提供更多代码(最好是MCVE),以帮助我们更好地帮助解决问题。


您的方法

可能的替代方案。看起来(从小代码片段和它的方法签名语义)你想要更改背景图像,当一个级别已经改变。在绘制图像时,请考虑在面板类中使用protected void paintComponent(Graphics 2d) { super.paintComponent(g); Grapchics2D g2 = (Graphics2D)g; renderLevelBackground(g2); } 方法。然后,您可以根据需要设置背景。像

这样的东西
setBackgroundImage(BufferedImage image)

因此,无论何时拨打public class BackgroundPanel extends JPanel { private BufferedImage backgroundImage; public void setBackgroundImage(BufferedImage image) { this.backgroundImage = image; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Grpahics2D g2 = (Graphics2D)g; if (image != null) { g2.drawImage(backgroundImage, 0, 0, this); } } } ,图像都会发生变化,并重新粉刷。

答案 1 :(得分:0)

您可能需要明确告诉JComponent您正在绘制它需要使用revalidate()repaint()重新绘制