在java中如何更改光标颜色?

在java中如何更改光标颜色?,java,swing,awt,Java,Swing,Awt,我正在学习swing图形,我想尝试在java中更改光标颜色。所以我下载了一些金星的gif文件,试图用作我的光标,但当我将图像添加为图像图标时,它将星星的颜色变为黑色 编辑:更改语法 import java.awt.Dimension; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import javax.swing.ImageIcon; import javax.swing.JFrame; impo

我正在学习swing图形,我想尝试在java中更改光标颜色。所以我下载了一些金星的gif文件,试图用作我的光标,但当我将图像添加为图像图标时,它将星星的颜色变为黑色

编辑:更改语法

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class stuff {
    public static void main (String[] args)
    {
        JFrame frame = new JFrame("FRAME");
        JPanel lpanel = new JPanel();
        frame.setContentPane(lpanel);
        ImageIcon goldStar = new ImageIcon("./res/goldStar.gif");
        JLabel gs = new JLabel(goldStar);
        lpanel.add(gs);

        goldStar = new ImageIcon(goldStar.getImage().getScaledInstance((int)(goldStar.getIconWidth()/13), (int)(goldStar.getIconHeight()/13), Image.SCALE_SMOOTH));
        lpanel.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(goldStar.getImage(),new Point(0,0), "custom cursor"));
        //I think these two lines are creating the problem.

        lpanel.setPreferredSize(new Dimension(1600,900));
        frame.setVisible(true);
        frame.pack();
    }
}
我浏览了cursor的一些方法,但没有找到任何可以帮助我的方法

这是我试图集成为鼠标光标的图片:

您应该考虑使用非动画图像,因为状态文档是:

请注意,多帧图像无效,可能导致此方法无效 挂断

或者,您可以使用
光标
对象数组(在您的情况下为自定义对象),并在
线程
中创建动画


下面是一个示例:。

您可以按说明加载gif图像帧并在其上循环

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main {

    private int currentIndex;

    public Main() throws IOException {
        JFrame frame = new JFrame("FRAME");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        frame.setContentPane(panel);

        List<Cursor> cursors = new ArrayList<>();
        List<BufferedImage> frames = getFrames("GWigb.gif");
        for (BufferedImage image : frames) {
            cursors.add(Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "cursor image"));
        }

        Timer timer = new Timer(50, (actionEvent) -> {
            panel.setCursor(cursors.get(currentIndex++));
            if (currentIndex >= cursors.size())
                currentIndex = 0;
        });
        timer.start();

        panel.setPreferredSize(new Dimension(1600, 900));
        frame.setVisible(true);
        frame.pack();
    }

    public List<BufferedImage> getFrames(String gif) throws IOException {
        List<BufferedImage> frames = new ArrayList<>();
        ImageReader reader = ImageIO.getImageReadersByFormatName("gif").next();
        File input = new File(gif);
        ImageInputStream stream = ImageIO.createImageInputStream(input);
        reader.setInput(stream);

        int count = reader.getNumImages(true);
        for (int index = 0; index < count; index++) {
             frames.add(reader.read(index));
        }
        return frames;
    }

    public static void main(String[] args) throws IOException {
        new Main();
    }

}
导入javax.imageio.imageio;
导入javax.imageio.ImageReader;
导入javax.imageio.stream.ImageInputStream;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
公共班机{
私有int-currentIndex;
public Main()引发IOException{
JFrame框架=新的JFrame(“框架”);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
frame.setContentPane(面板);
列表游标=新的ArrayList();
List frames=getFrames(“GWigb.gif”);
用于(BuffereImage图像:帧){
add(Toolkit.getDefaultToolkit().createCustomCursor(图像,新点(0,0),“光标图像”);
}
计时器计时器=新计时器(50,(actionEvent)->{
panel.setCursor(cursors.get(currentIndex++));
如果(currentIndex>=cursors.size())
currentIndex=0;
});
timer.start();
面板设置首选尺寸(新尺寸(1600900));
frame.setVisible(true);
frame.pack();
}
公共列表getFrames(字符串gif)引发IOException{
列表帧=新的ArrayList();
ImageReader=ImageIO.getImageReadersByFormatName(“gif”).next();
文件输入=新文件(gif);
ImageInputStream=ImageIO.createImageInputStream(输入);
reader.setInput(流);
int count=reader.getNumImages(true);
for(int index=0;index
是否可以以任何方式使用动画图像?@Objekshin:我不这么认为,但是如果您想自己创建动画,请查看最后一次编辑。@Objekshin:我测试了另一个答案,它运行得非常好(如果您没有使用Java 8,请检查使用
计时器的正确语法)。因为这在全球范围内比我的答案更好,所以我不介意你接受另一个答案:)