在 JFrame 中显示一个透明的 GIF 而没有在播放时保留每一帧? (初学者)

Posted

技术标签:

【中文标题】在 JFrame 中显示一个透明的 GIF 而没有在播放时保留每一帧? (初学者)【英文标题】:Displaying a transparent GIF in a JFrame without each frame remaining as it plays? (Beginner) 【发布时间】:2019-10-24 10:16:45 【问题描述】:

我正在尝试在 JFrame 中显示具有透明背景的 GIF。我的初始代码很简单。

import java.awt.*;
import javax.swing.*;
public class GUIProject 

    public static void main(String [] args)
    
        JFrame pokemonFrame = new JFrame();
        pokemonFrame.setSize(800, 800);
        ImageIcon imageLabel = new ImageIcon("/Users/Hannah/eclipse-workspace/Graphics/pokemon images/pikasprite.gif");
        JLabel label = new JLabel(imageLabel);
        pokemonFrame.setLayout(new FlowLayout());
        pokemonFrame.add(label);
        pokemonFrame.setVisible(true);  
    

不幸的是,我遇到了一个与this post 完全相同的问题。本质上,当 gif 循环播放时,gif 的过去帧会保留在屏幕上,从而产生一种重影效果。我使用的图像与我链接的帖子使用的图像完全相同。我已尝试实施所选答案给出的解决方案,但它对我不起作用,可能是因为它太先进了,我无法理解。

我只是一个初学者,但我真的很想为我正在为我的班级工作的项目解决这个问题。

我需要一些帮助来实现此代码或找到解决我遇到的问题的其他方法。 (如果这个问题不恰当,我很抱歉!我自己从未使用过 Stack Overflow,但我之前一直在潜伏。)

【问题讨论】:

I'm running into a problem that is the exact same as what this post entails - 告诉我们问题所在。从您的角度来看,我们不需要阅读另一个问题来找出问题所在。无论如何,在 JLabel 上将透明 gif 显示为 ImageIcon 对我来说效果很好。那就是在每个图像更改之前清除背景(我认为这是您的问题?)。我在 Windows 7 上使用 JDK8。在论坛上发布您的实际图像和问题的图像,就像在链接到问题中所做的那样,这样我们就可以看到确切的问题。 非常感谢您的意见!我会编辑我的帖子。是的,这就是问题所在。我使用的图片与我链接的论坛帖子完全相同。我不确定如何显示我的 JFrame 显示不正确的图像。哦,我在 OS Mojave 上使用最新版本的 JDK(我假设是 8?)。 我使用与论坛帖子完全相同的图像 - 那个 gif 不适合我。所以我建议问题是gif,而不是代码。尝试另一个动画 gif。 这很有趣。我总共使用了三种不同的 GIF。两个是相同的 3D 模型皮卡丘(一个正在做一个空闲动画,在他的攻击中),一个是 2D 皮卡丘精灵。不过,精灵 gif 以完全不同的方式搞砸了——每一帧都以某种方式被破坏,以至于白色像素覆盖了每一帧中精灵的不同部分。这非常令人困惑,我不知道如何解决它。 【参考方案1】:

这是我使用的代码:

import java.awt.*;
import javax.swing.*;

public class SSCCE extends JPanel

    public SSCCE()
    
        JLabel label = new JLabel( new ImageIcon("bart_simpson.gif") );
        add( label );

        setBackground( Color.YELLOW );
    

    private static void createAndShowGUI()
    
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
//      frame.setLocationByPlatform( true );
        frame.setVisible( true );
    

    public static void main(String[] args) throws Exception
    
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        
            public void run()
            
                createAndShowGUI();
            
        );
*/
    

这是我使用的图像:

我相信这是一个透明的图像,因为你可以改变面板的背景,背景通过图像显示出来。

【讨论】:

以上是关于在 JFrame 中显示一个透明的 GIF 而没有在播放时保留每一帧? (初学者)的主要内容,如果未能解决你的问题,请参考以下文章

Gif 没有在 JFrame 中播放

JFrame.setBackground(Color)修改ImageIcon大小

java swing问题:JFrame根面板不透明且可见,内容面板不透明且可见,层面板透明且可见,

为啥 JFrame 仍然不透明?

如何忽略 JFrame 不透明度?

Java - ol' 透明 JFrame,没有受限库