在Java中实现一些透明度的游标 [英] Implementing Cursor in Java with some Transparency
问题描述
我有一个35x40像素。 png图像我想在Swing应用程序中用作自定义光标。
图像有一个辉光,所以包含alpha透明度值。问题是当我尝试使用常规方法使用 Toolkit
生成自定义光标时,我得到黑色像素,其中Alpha透明度值应该是。
下面是我用于游标的图片:
的想法
I have a 35x40 px. png image I want to use as a custom cursor in a Swing application.
The image has a glow so contains alpha transparency values. Problem is when I attempt to use the conventional method of using the Toolkit
to generate the custom cursor I get black pixels where alpha transparency values should be.
Here is the image I am using for a cursor: https://dl.dropbox.com/u/1186703/cursor.png
Here is my code:
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);
}
Here is the current result:
Edit it seems that this method does not work well cross platform, for instance Windows LAF doesn't support semi-transparency. I am therefore looking for any solution to get this to work on windows, assuming this implementation does work on Mac OSX, i can just specify in code which implementation to use based on which operating system the app is running on.
The problem your having is to do with the Cursor
class which (under Windows) doesn't take into account the transparency values of the image
This is, by no means, a "real" solution, but is more about "fudging" the result...
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();
}
}
}
}
I got the idea for here
这篇关于在Java中实现一些透明度的游标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!