Gif光标不起作用

时间:2017-03-16 23:19:40

标签: java cursor

您好我有这段代码将光标转换为我拥有的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"));

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

  

线程“main”中的异常java.lang.NullPointerException at   sun.awt.SunToolkit.getImageFromHash(未知来源)at   sun.awt.SunToolkit.getImage(未知来源)

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

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

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

应该成为

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

两件事:

  1. getImage(String)假定该值是文件系统上的“文件”
  2. 构建后,将无法再从src目录访问该资源,也无法将其作为“文件”引用
  3. herehere所述,hotspot参数描述了“点击”点生成的图像内的偏移量。所以你绝对不应该使用new Point(welcomePanel.getX(), welcomePanel.getY()),因为这可能不会导致奇怪的结果。

    在Windows下,我相信你坚持使用32x32的游标大小,可能已经改变了Windows 10 / Java 8+,但我没有测试过它

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

    Animated GIFPNG作为我的测试游标。

    我能够显示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();
                        }
                    }
                });
            }
    
        }
    
    }