Search code examples
javacursor

Gif cursor not working


Hello I have this piece of code to convert the cursor to a gif image that I have.

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);

but the only thing is the program run without displaying anything at all ( Note the program runs perfectly with png image format ). So one of the solution I read on here it says that I need to replace this :

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

with this :

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

but when I do that I get this error

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

Any Help would be appreciated


Solution

  • Okay, so, this is probably a good indication that I need to go back to bed

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

    Should probably become

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

    Two things:

    1. getImage(String) assumes that the value is a "file" on the file system
    2. Once built, the resource will no longer be accessible from the src directory nor referenced as a "file"

    As described here and here, the hotspot parameter describes the offset from within the image at which a "click" point is generating. So you should most definitely not use new Point(welcomePanel.getX(), welcomePanel.getY()) because that's likely to cause no end of weird results.

    Under Windows, I believe you stuck to a cursor size of 32x32, might have changed for Windows 10/Java 8+, but I've not tested it

    For this example I used...

    Animated GIF and PNG as my test cursors.

    The ONLY way I was able to get the GIF to display was to use ImageIO.read to load it, which meant that it would not animate. Attempting to load the image with ImageIcon or Toolkit#createImage failed to display anything, I even employed a MediaTracker to try and ensure the image was loaded before creating the cursor

    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();
                        }
                    }
                });
            }
    
        }
    
    }