Почему, когда я устанавливаю изображение на курсор, оно не работает?

Я новичок в Java, и у меня возникла проблема при попытке установить изображение на курсор. Я использую BufferedImage а также 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 типы, но пока не работает. Не могли бы вы помочь мне с этим? Что мне нужно сделать, чтобы это работало?

2 ответа

Решение

Этот 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://stackru.com/images/be5825b63bdc0b602f63aae43893710c9f880b55.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);
    }
}

Я подозреваю, что вы неверно истолковали второй аргумент Toolkit.createCustomCursor (курсор изображения, точка hotSpot, имя строки):

hotSpot - X и Y горячей точки большого курсора; значения hotSpot должны быть меньше, чем Dimension, возвращаемое getBestCursorSize

hotspot подразумевается относительно левого верхнего угла изображения курсора, а не левого верхнего угла панели. Итак, вместо

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

просто попробуй

new Point(0, 0)
Другие вопросы по тегам