为什么我在paintComponent 中的gif 动画不起作用?

我正在创建一个 Java 游戏,在这个游戏中,我有一个可以由用户移动的飞机,但是如果飞机撞到任何一侧,它应该爆炸 - 这意味着应该在那个位置爆炸.我使用了诸如 Why gif animation doesn't animate when using it in paintComponent()? 和其他链接之类的链接来了解如何为 gif 设置动画,但是,我的代码不起作用。

相关代码如下:

            ImageIcon ii = new ImageIcon(this.getclass().getResource("explosion.gif"));
            Graphics2D g2d = (Graphics2D)g;
            
            g2d.drawImage(ii.getImage(),planeX,planeY,this);
            System.out.println("drawn");

虽然“drawn”正在控制台上打印出来,但爆炸 gif 没有加载。我检查了文件名,它是正确的。但是,我确实在我的代码中的其他地方使用了相同的 gif 并且它在那里工作,那么有什么东西可以防止在 Java 中两次使用 gif 吗?

这是我的整个paintComponent()方法:

        super.paintComponent(g);
        
        setfocusable(true);
        requestFocus();
        
        background = new ImageIcon("bg.png").getImage();
        g.drawImage(background,-6,700,null); //background of JPanel
        
        if (!hit) g.drawImage(plane,planeLen,planeHei,null);  //only draw plane if not exploded
        else if (count == 0) 
        {
            ImageIcon ii = new ImageIcon(this.getclass().getResource("explosion.gif"));
            Graphics2D g2d = (Graphics2D)g;
            
            g2d.drawImage(ii.getImage(),this); //doesn't work
            System.out.println("drawn"); //printed
        }

        title = new ImageIcon("title.png").getImage(); //transparent,is drawn
        g.drawImage(title,-9,20,218,null);
        
        title2 = new ImageIcon("title2.png").getImage(); //transparent,is drawn
        g.drawImage(title2,10,245,670,null);

我已经检查了 title 和 title2,它们是透明的,这意味着应该可以看到爆炸。我什至在这两个图像下方尝试了它,但仍然看不到爆炸。我也在这个面板上使用 JButtons 和 KeyListeners。

如果我应该添加任何其他内容,请告诉我,并提前感谢您!

diego0003 回答:为什么我在paintComponent 中的gif 动画不起作用?

在绘制方法中,您应该始终将 this 作为最终参数传递给 drawImage。如果图像有多个帧,或者图像在后台加载,这会告诉组件在更多图像可用时重新绘制自己。

组件的绘制经常发生。它由系统控制,而不仅仅是由调用组件的 repaint 方法的代码控制。事实上,绘画每秒发生多次是很常见的。许多超出程序员控制的系统事件都可以触发绘制,例如用户移动一个窗口,或另一个窗口移动,甚至用户移动鼠标。

出于这个原因,绘画不应执行诸如加载文件之类的缓慢操作。将图像的加载从绘画方法中移到类的构造函数中。将 Image 对象存储在私有字段中,paintComponent 可以在其中一次又一次地使用它们,而无需在每次绘制运行时重新加载它们。

由于绘制时间超出您的控制范围,因此永远不要更改绘制方法中组件的状态,这一点很重要。将 setFocusablerequestFocus 移出您的paintComponent 方法。这些调用应该在构建组件并将其添加到窗口的代码中。

最后,请注意,如果您将应用程序打包到 .jar 文件中,则无法从文件加载图像。 .jar 文件是单个压缩档案;其中的条目不再是文件,它们只是存档中的字节序列。使用 getResource 加载所有文件将解决这个问题,因为 getResource 在类路径中的每个 .jar 文件中查找。

,

没关系,我必须复制“explosion.gif”。它现在工作正常! 但是,请让我知道是否有另一种方法可以更快更有效地做到这一点。谢谢!

本文链接:https://www.f2er.com/547384.html

大家都在问