Gif 光标不工作

Gif cursor not working

您好,我有这段代码可以将光标转换为我拥有的 gif 图片。

Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image welcomePanel_Alien_Image = toolkit.getImage("src/Images/loading.gif");
        Cursor welcomePanel_Alien_Cursor = toolkit.createCustomCursor
        (welcomePanel_Alien_Image , new Point(welcomePanel.getX(), 
         welcomePanel.getY()), "img");

         welcomePanel.setCursor (transparentCursor);

但唯一的问题是程序 运行 根本没有显示任何内容(请注意程序 运行 完全符合 png 图像格式)。所以我在这里阅读的解决方案之一说我需要替换它:

Image welcomePanel_Alien_Image = toolkit.getImage("src/Images/loading.gif");

用这个 :

 Image image = toolkit.getImage(getClass().getResource("pencil.gif"));

但是当我这样做时我得到了这个错误

Exception in thread "main" java.lang.NullPointerException at sun.awt.SunToolkit.getImageFromHash(Unknown Source) at sun.awt.SunToolkit.getImage(Unknown Source)

任何帮助将不胜感激

好吧,这可能是我需要回去睡觉的一个很好的迹象

Image welcomePanel_Alien_Image = toolkit.getImage("src/Images/loading.gif");

应该会变成

Image welcomePanel_Alien_Image = toolkit.getImage(getClass().getResource("/Images/loading.gif"));

两件事:

  1. getImage(String) 假定该值是文件系统上的 "file"
  2. 构建后,将无法再从 src 目录访问资源,也无法将其引用为 "file"

here and here 所述,hotspot 参数描述了图像中生成 "click" 点的偏移量。所以你绝对不应该使用 new Point(welcomePanel.getX(), welcomePanel.getY()) 因为这可能会导致无穷无尽的奇怪结果。

在 Windows 下,我相信您坚持使用 32x32 的光标大小,可能已更改 Windows 10/Java 8+,但我没有测试过

对于这个例子,我使用了...

and 作为我的测试游标。

我能够显示 GIF 的唯一方法是使用 ImageIO.read 加载它,这意味着它不会动画。尝试使用 ImageIconToolkit#createImage 加载图像无法显示任何内容,我什至使用 MediaTracker 来尝试确保在创建光标之前加载图像

import java.awt.Cursor;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

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

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("test");
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JButton normal = new JButton("Normal");
            JButton gif = new JButton("GIF");
            JButton png = new JButton("PNG");

            add(normal);
            add(gif);
            add(png);

            normal.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setCursor(Cursor.getDefaultCursor());
                }
            });

            gif.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
//                    try {
//                        Image image = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/images/cursor.gif"));
//                        MediaTracker mt = new MediaTracker(TestPane.this);
//                        mt.addImage(image, 1);
//                        mt.waitForAll();
//                        Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "gifCursor");
//                        
//                        setCursor(cursor);
//                    } catch (InterruptedException ex) {
//                        ex.printStackTrace();
//                    }
                    try {
                        Image image = ImageIO.read(getClass().getResource("/images/cursor.gif"));
                        Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "gifCursor");

                        setCursor(cursor);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            png.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        Image image = ImageIO.read(getClass().getResource("/images/cursor.png"));
                        Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "pngCursor");

                        setCursor(cursor);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }

    }

}