private void renderLevelBackground(Graphics2D g2) {
Image backgroundImage = model.getBackgroundImage();
g2.drawImage(backgroundImage, 0, 0, null);
}
这是我的代码,我知道backgroundImage已正确加载,因为如果我得到了Width / Height,它会给我正确的值。无论如何都要测试它是否是图像,或者它是否以某种方式表示方法?尽管我已经在这个项目中多次使用了drawImage方法,但它只是在我的屏幕上画画,所有这些都完美无瑕地工作。
由于
答案 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()
重新绘制