您好我有这段代码将光标转换为我拥有的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(未知来源)
任何帮助将不胜感激
答案 0 :(得分:1)
好吧,这可能是我需要回去睡觉的一个很好的迹象
Image welcomePanel_Alien_Image = toolkit.getImage("src/Images/loading.gif");
应该成为
Image welcomePanel_Alien_Image = toolkit.getImage(getClass().getResource("/Images/loading.gif"));
两件事:
getImage(String)
假定该值是文件系统上的“文件”src
目录访问该资源,也无法将其作为“文件”引用如here和here所述,hotspot
参数描述了“点击”点生成的图像内的偏移量。所以你绝对不应该使用new Point(welcomePanel.getX(), welcomePanel.getY())
,因为这可能不会导致奇怪的结果。
在Windows下,我相信你坚持使用32x32的游标大小,可能已经改变了Windows 10 / Java 8+,但我没有测试过它
对于这个例子我使用了......
我能够显示GIF的唯一方法是使用ImageIO.read
加载它,这意味着它不会动画。尝试使用ImageIcon
或Toolkit#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();
}
}
});
}
}
}