在Java中有一些透明度实现光标(Implementing Cursor in Java with

2019-07-03 17:12发布

我有一个35x40像素。 PNG图像我想作为一个Swing应用程序自定义光标使用。 图像具有辉光所以包含alpha透明度值。 问题是,当我尝试使用使用的常规方法Toolkit来生成定义光标我得到黑色的像素,其中alpha透明度值应。

下面是我使用的光标图像: https://dl.dropbox.com/u/1186703/cursor.png

这里是我的代码:

public static void main(String[] args) throws IOException {

     new Sandbox().gui();

}
private Cursor cursor;

private Toolkit kit;

private Image cursorImage;

public void gui() {

    kit = Toolkit.getDefaultToolkit();
    cursorImage = kit.createImage(getClass().getResource(
            "/aurora/V1/resources/cursor.png"));

    cursor = Toolkit.getDefaultToolkit().createCustomCursor(
            cursorImage, new Point(0, 0), "CustomCursor");

    setSize(800, 800);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    setCursor(cursor);
}

下面是当前的结果:

编辑看来,这种方法并不能很好的工作的跨平台,例如LAF的Windows不支持半透明度。 所以我要寻找的任何解决方案得到这个工作在Windows上,假设这实现在Mac OSX确实工作,我可以指定代码实现了基于该操作系统的应用程序正在运行的使用。

Answer 1:

您遇到的问题是用做Cursor类(Windows下)没有考虑到图像的透明度值

这是,决不是一个“真实”的解决方案,但更多的是“捏造”的结果...

public class TestMouseCursor {

    public static void main(String[] args) {
        new TestMouseCursor();
    }

    public TestMouseCursor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MouseCursorPane());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MouseCursorPane extends JPanel {

        private BufferedImage cursorImage;
        private Toolkit kit;

        public MouseCursorPane() {
            try {
                kit = Toolkit.getDefaultToolkit();
                cursorImage = ImageIO.read(getClass().getResource("/cursor02.png"));
                for (int i = 0; i < cursorImage.getHeight(); i++) {
                    int[] rgb = cursorImage.getRGB(0, i, cursorImage.getWidth(), 1, null, 0, cursorImage.getWidth() * 4);
                    for (int j = 0; j < rgb.length; j++) {
                        int alpha = (rgb[j] >> 24) & 255;
                        if (alpha < 128) {
                            alpha = 0;
                        } else {
                            alpha = 255;
                        }
                        rgb[j] &= 0x00ffffff;
                        rgb[j] = (alpha << 24) | rgb[j];
                    }
                    cursorImage.setRGB(0, i, cursorImage.getWidth(), 1, rgb, 0,
                            cursorImage.getWidth() * 4);
                }
                Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(
                        cursorImage, new Point(0, 0), "CustomCursor");

                setCursor(cursor);

            } catch (Exception exp) {
                exp.printStackTrace();
            }
        }
    }
}

我的想法在这里



Answer 2:

您的代码和光标图像实际上产生在MacOS X 10.7.5(JDK 1.6.0_31)与半透明的蓝色边界所需的结果。 但是,我也注意到在关闭评论这个回答说,部分透明是不是在默认的Windows外观的支持和感觉。



Answer 3:

如果你是绝望的,绝对必须有透明的光标,不管结果如何,你可以使用JNI,并设置光标手动使用Win32 API。 因为XP的支持阿尔法光标Windows系统,因此你应该确定这一点。

但你失去的平台独立性。 而基于Windows设置,alpha混合可能是针对特定用户关闭。



Answer 4:

另一种方法是假的光标。

看看亚历山大Potochkin的不乖玻璃面板 。

特别是,运行示例代码,选择Options>GlassPane is VisibleOptions>Final GlassPane

由此出发,加载了一个光标图像是完全透明的,然后画上的glassPane适当,阿尔法混合光标。



文章来源: Implementing Cursor in Java with some Transparency