paint()不能绘制gif,但png工作正常吗?

时间:2017-09-12 03:28:41

标签: java swing rendering paint gif

我正在使用JLabel试图在其上绘制动画gif图像。我可以使用构造函数new JLabel(new ImageIcon(FML.class.getResource("giphy.gif")));,这将工作得很好但是当我重写paint方法时,它似乎根本不想绘制它。图像不是静止的,它不存在!我应该提一下,下面显示的两种方法与PNG完全正常,但不是GIF。我错过了什么或者这是一个java bug吗? (使用java 1.8)

编辑:我一直在环顾四周,似乎我并没有完全忘记我需要做什么,但我错过了一些东西。我看过很多帖子Like this one但在这种情况下似乎没有用。

我应该注意到,课堂上没有其他内容,这是一个简单的JPanel。

    import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FML {

    public static void main(String[] args) {
        new FML();
    }

    public FML() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().setLayout(new FlowLayout());
                frame.getContentPane().add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private ImageIcon animatedGif;

        public TestPane() {
            setLayout(new GridBagLayout());
            JButton btn = new JButton(new ImageIcon(FML.class.getResource("FmDxW.png")));
            btn.setSize(50, 50);
            btn.setRolloverEnabled(true);
            animatedGif = new ImageIcon(FML.class.getResource("giphy.gif"));
            btn.setRolloverIcon(animatedGif);
            add(btn);

            btn.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseEntered(MouseEvent e) {
                    animatedGif.getImage().flush();
                }

            });

            //I need this
            final ImageIcon image = new ImageIcon(FML.class.getResource("giphy.gif"));

            //To render over this
            final ImageIcon image2 = new ImageIcon(FML.class.getResource("fmDxW.png"));


            //I'm not understanding why I can add the gif into the constructor but the paint method fails.
            JLabel label = new JLabel(image) {
                @Override
                public void paint(Graphics g) {
                    super.paint(g);
                    g.drawImage(image2.getImage(), 64, 64, this);
                }
            };
            //setSize because I want to be 100% sure that it's loading the correct size.
            //Removing it doesn't affect the problem at hand.
            label.setSize(64, 64);
            add(label);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

g.drawImage(image2.getImage(), 64, 64, this);

假设您的图像大小为64,为什么要尝试在标签范围之外绘制第二个图像?当我将位置更改为(0,0)时,gif为我绘画很好(但我没有使用动画gif)。

  

下面显示的两种方法与PNG完全正常,但不是GIF。

我不知道上面提到的原因是怎么回事。无论如何,你是否用普通的gif尝试过它?

这就是为什么你不应该自己管理这幅画的原因,因为现在你需要担心位置并且硬编码位置不是一个好习惯。让你的布局经理为你做这件事。

再次,你为什么要这样做。为什么要尝试覆盖绘制方法以绘制第二个图像?

相反,你应该做的事情如下:

  1. 在paintComponent()方法中绘制两个图像
  2. 使用带有OverlayLayout的面板,然后您可以将两个标签叠放在一起。
  3. 您甚至可以将布局的布局管理器设置为GridBagLayout,然后当您向标签添加JLabel时,它将自动居中。
  4.   

    // setSize因为我想100%确定它正在加载正确的大小。

    您说您知道布局管理员的工作方式。好吧,如果你这样做,你知道这个语句将什么都不做,因为布局管理器会覆盖你设置的任何值,所以使用这样的代码错误并显示基本缺乏理解,不应该包含在MCVE中MCVE`的目的是尽可能地简化问题。