Swing: как сделать пользовательский курсор прозрачным?

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

public void CustomCursor()
{
    Toolkit t1 = Toolkit.getDefaultToolkit();
    Image img = t1.getImage("src/AppImages/Cursor1.png");
    Point point = new Point(0,0);
    Cursor cursor = t1.createCustomCursor(img, point, "Cursor");
    setCursor(cursor);    
}

Этот метод вызывается в конструкторе Jframe.

введите здесь описание изображения

Это изображение cursor1.png размером 25x25px.

После запуска кода:

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Если я использую cursor1.png как JLabel, все выглядит нормально:

введите здесь описание изображения

MCVE

import java.awt.*;
import java.net.*;
import java.util.logging.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class CustomCursor {

    private JComponent ui = null;

    CustomCursor() {
        initUI();
    }

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

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(20, 200, 20, 200));
        Toolkit t1 = Toolkit.getDefaultToolkit();
        Image img;
        try {
            URL url = new URL("http://i.stack.imgur.com/sJKuE.png");
            img = t1.getImage(url);
            Point point = new Point(0, 0);
            Cursor cursor = t1.createCustomCursor(img, point, "Cursor");
            ui.setCursor(cursor);
            ui.add(new JLabel(new ImageIcon(url)));
        } catch (MalformedURLException ex) {
            Logger.getLogger(CustomCursor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    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) {
                }
                CustomCursor o = new CustomCursor();

                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);
    }
}

Кто-нибудь может сказать, почему так происходит?


person Zujaj Misbah Khan    schedule 25.08.2015    source источник
comment
Интересно.. В качестве курсора полупрозрачные пиксели изображения кажутся «залитыми» сплошным цветом, но этого не происходит, если он отображается в виде JLabel..   -  person Andrew Thompson    schedule 25.08.2015
comment
Кстати, я добавил минимальный воспроизводимый пример, в котором я увидел эти результаты, чтобы другим было проще работать.   -  person Andrew Thompson    schedule 25.08.2015
comment
@ZMKhan только что попробовал его на MAC - он выглядит точно так же, как на этикетке. Похоже, проблема может зависеть от платформы.   -  person Dakshinamurthy Karra    schedule 25.08.2015
comment
@KDM Возможно, вы правы. Я использую абсолютный макет для Jframe в Netbeans в Windows 7. Есть ли способ решить эту проблему?   -  person Zujaj Misbah Khan    schedule 25.08.2015
comment
@ZMKhan Я попробую преобразовать изображение в GIF. По крайней мере, в Windows у IE были проблемы с прозрачностью PNG — кто знает?   -  person Dakshinamurthy Karra    schedule 25.08.2015
comment
@KDM хорошо, но изменение изображения на gif изменит прозрачность   -  person Zujaj Misbah Khan    schedule 25.08.2015
comment
@ZMKhan gif также поддерживает альфа-канал, так что все должно быть в порядке.   -  person Dakshinamurthy Karra    schedule 25.08.2015
comment
@KDM о, это хорошо.   -  person Zujaj Misbah Khan    schedule 25.08.2015
comment
@KDM Важное различие между PNG и GIF заключается в том, что, хотя GIF поддерживает прозрачные пиксели, PNG поддерживает полупрозрачные пиксели. Эти полупрозрачные пиксели в изображении PNG необходимо преобразовать либо в полную прозрачность, либо в сплошной цвет в GIF.   -  person Andrew Thompson    schedule 25.08.2015
comment
О, и да, я тоже смотрел его на Windows 7.   -  person Andrew Thompson    schedule 25.08.2015
comment
@AndrewThompson работало ли это при использовании GIF? Для изображения 25x25 нужно быть настоящим перфекционистом, чтобы использовать полупрозрачные пиксели :)   -  person Dakshinamurthy Karra    schedule 25.08.2015
comment
@KDM это работало при использовании GIF? Я не пытался конвертировать изображение.   -  person Andrew Thompson    schedule 25.08.2015
comment
@AndrewThompson Загрузил конвертированное изображение на i.imgur.com/TdNaLi6.gif. Попробуйте. это и скажи мне. ТИА.   -  person Dakshinamurthy Karra    schedule 25.08.2015
comment
@KDM Попробуйте, пожалуйста, и расскажите мне. Здесь все хорошо. Мои глаза не очень хороши, но я не заметил большой разницы между GIF (как в метке, так и в курсоре) и исходным PNG в метке.   -  person Andrew Thompson    schedule 25.08.2015
comment
@KDM Я попробовал это как гифку, но это бесполезно, результат тот же   -  person Zujaj Misbah Khan    schedule 25.08.2015
comment
Я знаю, это звучит глупо, но есть ли способ использовать Jlabel в качестве пользовательского курсора?   -  person Zujaj Misbah Khan    schedule 26.08.2015


Ответы (1)


Проблема в Windows; прозрачные пиксели просто не учитываются.

В этот пост есть действительно хороший ответ о том, как это исправить. . Еще один хороший ответ здесь.

person Matthew Meacham    schedule 25.08.2015