有没有办法隐藏光标(除了使用透明图像作为光标)?
答案 0 :(得分:65)
Cursor
类似乎没有“空白”光标,因此可以使用Toolkit.createCustomCursor
方法定义一个新的“空白”光标。
这是我试过的一种似乎有用的方法:
// Transparent 16 x 16 pixel cursor image.
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
// Create a new blank cursor.
Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
cursorImg, new Point(0, 0), "blank cursor");
// Set the blank cursor to the JFrame.
mainJFrame.getContentPane().setCursor(blankCursor);
修改强>
关于JFrame
内没有光标的所有内容的注释,似乎Component
中包含的JFrame
最终将继承容器的光标(JFrame
),因此如果要求某个Component
出现光标,则必须手动设置所需的光标。
例如,如果JPanel
中包含JFrame
,则可以使用Cursor.getDefaultCursor
方法将JPanel
的光标设置为系统的默认值:
JPanel p = ...
// Sets the JPanel's cursor to the system default.
p.setCursor(Cursor.getDefaultCursor());
答案 1 :(得分:6)
tl; dr AWT工具包在2017年仍然存在漏洞';因此,适当的解决方案是致电
w.setCursor( w.getToolkit().createCustomCursor(
new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ),
new Point(),
null ) );
代替。
根据Javadoc page for createCustomCursor
,
创建一个新的自定义光标对象。 如果要显示的图像无效,则将隐藏光标(制作 完全透明),热点将设置为(0,0)。
它将遵循那个
w.setCursor( w.getToolkit().createCustomCursor( null, null, null ) );
应该做的伎俩。遗憾的是,有一个与此案例相关的错误未由代码处理,请参阅例如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089(特别适用于MacOS,但通过浏览来源,您可能很容易发现{{1}的任何中没有检查第一个参数Image
值的有效性}平台实现;有Toolkit
检查,在这种情况下不做它的工作),所以传递tracker.isErrorAny()
或无效null
只会抛出NPEx。
答案 2 :(得分:3)
在Mac OS下使用LWJGL时,您需要这样做:
System.setProperty("apple.awt.fullscreenhidecursor","true");
答案 3 :(得分:3)
frame.setCursor(frame.getToolkit().createCustomCursor(
new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0),
"null"));
答案 4 :(得分:2)
在文档中它说如果图像无效,那么它默认是透明的,因此传递空图像将产生透明光标。但是将null
传递给图像的方法将导致异常。
Toolkit tk= getToolkit();
Cursor transparent = tk.createCustomCursor(tk.getImage(""), new Point(), "trans");
答案 5 :(得分:1)
我更容易解决这个问题:
final Timer cursorTimer = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getContentPane().setCursor(null);
}
});
cursorTimer.start();
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
getGlassPane().setCursor(Cursor.getDefaultCursor());
cursorTimer.restart();
}
});