标签中gif的Java问题

标签中gif的Java问题,java,swing,user-interface,jpanel,gif,Java,Swing,User Interface,Jpanel,Gif,我试图放入JPanel的gif在单击触发它的按钮后不会显示,直到我调整窗口大小。当它确实出现时,它不适合JPanel并且没有设置动画。我看了几篇关于这方面的文章,但我不知道如何在我的案例中使用它们 /* * Author: Raymo111 * Date: 13/04/2018 * Description: Wishes happy birthday to a special someone */ //Imports java GUI classes import javax.imag

我试图放入JPanel的gif在单击触发它的按钮后不会显示,直到我调整窗口大小。当它确实出现时,它不适合JPanel并且没有设置动画。我看了几篇关于这方面的文章,但我不知道如何在我的案例中使用它们

/*
 * Author: Raymo111
 * Date: 13/04/2018
 * Description: Wishes happy birthday to a special someone
 */

//Imports java GUI classes
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

// Main class with JFrame and ActionListener enabled
public class Happy_Birthday_GUI extends JFrame implements ActionListener {

    // Class variables
    private static JButton startButton = new JButton("CLICK TO START");
    private static JPanel startPanel = new JPanel(), gifPanel = new JPanel();
    private static Color blue = new Color(126, 192, 238), pink = new Color(255, 192, 203);
    private static GridLayout grid1 = new GridLayout(1, 1);

    // Constructor
    public Happy_Birthday_GUI() {

        // Initial screen
        startButton.addActionListener(this);
        startButton.setFont(new Font("Comic Sans MS", Font.PLAIN, 50));
        startPanel.setLayout(grid1);
        startPanel.add(startButton);
        startPanel.setBorder(BorderFactory.createLineBorder(blue, 100));
        startButton.setBackground(pink);
        getContentPane().add(startPanel);

        // Sets title, size, layout (grid 1x1), and location of GUI window (center)
        setTitle("Happy Birthday from Dolphin");
        setSize(840, 840);
        setLayout(grid1);
        setLocationRelativeTo(null);
        setVisible(true);

    }

    // Main method
    public static void main(String[] args) {
        new Happy_Birthday_GUI();
    }

    // Action Performed method
    public void actionPerformed(ActionEvent event) {

        // Proceed to gif and song
        if (startButton == event.getSource()) {
            getContentPane().removeAll();
            BufferedImage dolphin;
            gifPanel.setLayout(grid1);
            gifPanel.setBorder(BorderFactory.createLineBorder(pink, 100));
            try {
                dolphin = ImageIO.read(new File("C:\\Users\\raymo\\Pictures\\dolphin.gif"));
                JLabel gifLabel = new JLabel(new ImageIcon(dolphin));
                gifPanel.add(gifLabel);
            } catch (IOException e) {
                e.printStackTrace();
            }
            getContentPane().add(gifPanel);
        }
    }

}

这是dolphin.gif。很可爱


如何让它在单击开始按钮后立即显示为适合JPanel的动画gif?提前谢谢

我试着输入一个JPanel,但点击按钮后它没有出现

从可见GUI添加(或删除)组件时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();
需要使用revalidate()调用布局管理器,以便为组件指定大小

没有动画

使用带有图像图标的JLabel来显示图像。JLabel将为gif设置动画

当它出现时,它不适合JPanel和

您可以尝试填充标签可用空间的

我试着输入一个JPanel,但点击按钮后它没有出现

从可见GUI添加(或删除)组件时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();
需要使用revalidate()调用布局管理器,以便为组件指定大小

没有动画

使用带有图像图标的JLabel来显示图像。JLabel将为gif设置动画

当它出现时,它不适合JPanel和

您可以尝试使用设计用于填充标签可用空间的。

我最后做了:

gifPanel.add(new TestPane());
getContentPane().add(gifPanel);
revalidate();
repaint();
使用camickr的重新验证和重新绘制,以及MadProgrammer的TestPane类, 这非常有效,可以让gif动画化、正确调整大小并立即显示。

我最后做了:

gifPanel.add(new TestPane());
getContentPane().add(gifPanel);
revalidate();
repaint();
使用camickr的重新验证和重新绘制,以及MadProgrammer的TestPane类,
它可以很好地使gif动画化、正确调整大小并立即显示。

BuffereImage
不支持绘制动画gif,相反,您需要使用
Image
(或者最好是
ImageIcon

这可以直接应用于
JLabel
,它将自己执行动画操作

适合JPanel的动画gif

好的,这是一个更复杂的问题。一种方法是将Gif转换为所需的大小,但不用说,这非常非常复杂

一个更简单的解决方案可能是使用
仿射变换
并缩放图像以满足组件本身的要求。这需要一个自定义组件,能够计算比例并绘制图像的每一帧

幸运的是,
JPanel
是一个
ImageObserver
,这意味着它能够绘制gif动画


BufferedImage
不支持绘制动画GIF,相反,您需要使用
Image
(或者最好是
ImageIcon

这可以直接应用于
JLabel
,它将自己执行动画操作

适合JPanel的动画gif

好的,这是一个更复杂的问题。一种方法是将Gif转换为所需的大小,但不用说,这非常非常复杂

一个更简单的解决方案可能是使用
仿射变换
并缩放图像以满足组件本身的要求。这需要一个自定义组件,能够计算比例并绘制图像的每一帧

幸运的是,
JPanel
是一个
ImageObserver
,这意味着它能够绘制gif动画


重新绘制不起作用,如何使用拉伸图标?
重新绘制不起作用-为什么要将标签添加到面板,然后将面板添加到内容窗格?在这种情况下,您需要重新验证()内容窗格,因为它是您实际添加到框架中的组件。在这种情况下,您可以在JFrame上使用revalidate()
重新绘制()
提供了一个空白屏幕。
提供了一个空白屏幕。
-一旦使用ImageIcon(…)而不是ImageIO加载图像,我在这里提出的所有建议对我来说都很好。您错误地更改了代码
我不知道如何使用的stretchIcon,它就像ImageIcon一样。阅读链接。下载课程。查看API并选择适当的构造函数来读取图像。@Raymo111,你的意思是什么?。你是那个无视我建议的人。我建议使用StretchIcon,它与ImageIcon一样易于使用。StretchIcon还可以用于任何其他可以使用图标(如JButton)的组件(尽管动画GIF仅适用于JLabel)。我还告诉过您,您的代码很好,只需在正确的位置添加revalidate()。如果事实是我重复了很多次。这是什么意思?在这次谈话中,你没有一次对帮助说“谢谢”。你所做的就是不断寻求更多的帮助!重新绘制不起作用,如何使用拉伸图标?
重新绘制不起作用-为什么要将标签添加到面板,然后将面板添加到内容窗格?在这种情况下,您需要重新验证()内容窗格,因为它是您实际添加到框架中的组件。在这种情况下,您可以在JFrame上使用revalidate()
重新绘制()
提供了一个空白屏幕。
提供了一个空白屏幕。
-一旦使用ImageIcon(…)而不是ImageIO加载图像,我在这里提出的所有建议对我来说都很好。您错误地更改了代码
我不知道如何使用的stretchIcon,它就像ImageIcon一样。阅读链接。下载课程。查看API并选择适当的构造函数进行阅读