【问题标题】:How do you change the cursor color in java?你如何在java中更改光标颜色?
【发布时间】:2017-06-01 15:05:17
【问题描述】:

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

编辑:更改语法

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 的方法,但没有找到任何可以帮助我的方法。

这是我试图整合为鼠标光标的图片:

【问题讨论】:

    标签: java swing awt


    【解决方案1】:

    您可以按照here 的说明加载 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();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您应该考虑使用非动画图像,因为Toolkit.createCustomCursor 的文档指出:

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

      或者,您可以使用 Cursor 对象的数组(在您的情况下是自定义对象),并在 Thread 中创建动画。

      这是一个例子:Change Cursor in a thread for animation : Cursor

      【讨论】:

      • 是否可以以任何方式使用动画图像?
      • @Objekshin :我不这么认为,但如果你想自己创建动画,请查看最后的编辑。
      • @Objekshin :我测试了另一个答案,它运行良好(如果您不使用 Java 8,请检查正确的语法以使用 Timer)。由于它在全球范围内是比我更好的答案,因此我不介意您接受这个其他答案:)
      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 2019-09-23
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 2012-07-23
      相关资源
      最近更新 更多