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"));
两件事:
getImage(String)
假定该值是文件系统上的 "file"
- 构建后,将无法再从
src
目录访问资源,也无法将其引用为 "file"
如 here and here 所述,hotspot
参数描述了图像中生成 "click" 点的偏移量。所以你绝对不应该使用 new Point(welcomePanel.getX(), welcomePanel.getY())
因为这可能会导致无穷无尽的奇怪结果。
在 Windows 下,我相信您坚持使用 32x32 的光标大小,可能已更改 Windows 10/Java 8+,但我没有测试过
对于这个例子,我使用了...
and 作为我的测试游标。
我能够显示 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();
}
}
});
}
}
}
您好,我有这段代码可以将光标转换为我拥有的 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"));
两件事:
getImage(String)
假定该值是文件系统上的 "file"- 构建后,将无法再从
src
目录访问资源,也无法将其引用为 "file"
如 here and here 所述,hotspot
参数描述了图像中生成 "click" 点的偏移量。所以你绝对不应该使用 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();
}
}
});
}
}
}