Java 为什么当我将图像设置为光标时,它不会';不行?

Java 为什么当我将图像设置为光标时,它不会';不行?,java,image,swing,mouse-pointer,Java,Image,Swing,Mouse Pointer,我是Java新手,在尝试将图像设置为光标时遇到问题。我使用的是buffereImage和Graphics.drawImage,但它只绘制图像的颜色,而不是完整的png图像 这是我的密码: /*The images List*/ iconsBet.add(ImageIO.read(getClass().getResource("/resources/ChipType"+ String.valueOf(maxChipBet+1) +".png"))); /*The images List*/ Bu

我是Java新手,在尝试将图像设置为光标时遇到问题。我使用的是
buffereImage
Graphics.drawImage
,但它只绘制图像的颜色,而不是完整的png图像

这是我的密码:

/*The images List*/
iconsBet.add(ImageIO.read(getClass().getResource("/resources/ChipType"+ String.valueOf(maxChipBet+1) +".png")));
/*The images List*/

BufferedImage output = new BufferedImage(iconsBet.get(0).getWidth(), iconsBet.get(0).getHeight(), BufferedImage.TYPE_INT_ARGB );
Graphics graphicsCursorIcon = output.getGraphics();

int count = 0;
for(BufferedImage icon : iconsBet)
{                
   graphicsCursorIcon.drawImage(icon, 0, count*10, null);
   count++;
}

graphicsCursorIcon.dispose();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Cursor c = toolkit.createCustomCursor(output , new Point(mainPanel.getX(), mainPanel.getY()), "img");
mainPanel.setCursor(c);
图像:

该程序只画一个红色圆圈,而不是png图像

我已经尝试使用所有的
BufferedImage
类型,但仍然不起作用。
你能帮我做这个吗?我需要做什么才能让它工作?

我怀疑你误解了第二个论点:

热点
-大光标热点的X和Y; 热点值必须小于getBestCursorSize返回的维度

热点
是指相对于光标图像的左上角, 不在面板的左上角。 因此,与其

new Point(mainPanel.getX(), mainPanel.getY())
试试看

new Point(0, 0)

我怀疑你误解了第二个论点:

热点
-大光标热点的X和Y; 热点值必须小于getBestCursorSize返回的维度

热点
是指相对于光标图像的左上角, 不在面板的左上角。 因此,与其

new Point(mainPanel.getX(), mainPanel.getY())
试试看

new Point(0, 0)

这个MCVE在这里工作,尽管它将光标缩小到更小的大小

import java.awt.*;
import java.awt.image.*;
import java.io.IOException;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.URL;

public class CustomImageCursor {

    private JComponent ui = null;

    CustomImageCursor() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(40, 400, 40, 40));

        try {
            BufferedImage bi = ImageIO.read(
                    new URL("https://i.stack.imgur.com/b89MA.png"));
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            Cursor c = toolkit.createCustomCursor(bi, new Point(0, 0), "img");
            ui.setCursor(c);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                CustomImageCursor o = new CustomImageCursor();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

这个MCVE在这里工作,尽管它将光标缩小到更小的大小

import java.awt.*;
import java.awt.image.*;
import java.io.IOException;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.URL;

public class CustomImageCursor {

    private JComponent ui = null;

    CustomImageCursor() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(40, 400, 40, 40));

        try {
            BufferedImage bi = ImageIO.read(
                    new URL("https://i.stack.imgur.com/b89MA.png"));
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            Cursor c = toolkit.createCustomCursor(bi, new Point(0, 0), "img");
            ui.setCursor(c);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                CustomImageCursor o = new CustomImageCursor();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

非常感谢,你是对的,我误解了。我已经纠正了,但这不是我问题的原因。因为我只需要复制按钮图像并在光标上绘制,但它只绘制一个带颜色的圆,而不是完整的PNG图像。非常感谢您的观察。@DarthHollow那么您的图像仍然存在问题。您应该将这些添加到您的问题中以获得好的答案。谢谢您的建议,我已经将图像放入了问题中。@DarthHollow您的图像相当大(300x298)。我不知道这是否会引起问题。但是典型的光标图像不大于32x32。非常感谢,你说得对,我误解了。我已经纠正了,但这不是我问题的原因。因为我只需要复制按钮图像并在光标上绘制,但它只绘制一个带颜色的圆,而不是完整的PNG图像。非常感谢您的观察。@DarthHollow那么您的图像仍然存在问题。您应该将这些添加到您的问题中以获得好的答案。谢谢您的建议,我已经将图像放入了问题中。@DarthHollow您的图像相当大(300x298)。我不知道这是否会引起问题。但典型的光标图像不大于32x32。在windows上,光标大小限制为32x32-可能已更改,但在windows 7/Java 7下,情况就是这样,您将图像绘制在彼此的顶部。你确定他们有适当的透明度吗?可能是最后一张图片完全覆盖了之前的所有图片。1)为了更快地获得更好的帮助,请发布或。2) 例如,获取图像的一种方法是热链接到中看到的图像。虽然在这种情况下,您可能会热链接到问题中嵌入的图像。在windows上,您的光标大小限制为32x32-它可能已更改,但在windows 7/Java 7下,您将图像绘制在彼此的顶部。你确定他们有适当的透明度吗?可能是最后一张图片完全覆盖了之前的所有图片。1)为了更快地获得更好的帮助,请发布或。2) 例如,获取图像的一种方法是热链接到中看到的图像。虽然在这种情况下,您可能会热链接到问题中嵌入的图像。