如何隐藏Swing应用程序中的游标?
有没有办法隐藏光标(除了使用透明图像作为光标)?
看来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
内部没有游标的所有内容的注释,看起来JFrame
中包含的Component
将最终inheritance容器( JFrame
)的游标,所以如果要求具有某个Component
有光标出现,人们将不得不手动设置所需的光标。
例如,如果JFrame
包含JFrame
,那么可以使用Cursor.getDefaultCursor
方法将该JPanel
的游标设置为系统的默认值:
JPanel p = ... // Sets the JPanel's cursor to the system default. p.setCursor(Cursor.getDefaultCursor());
tl; dr AWT工具包在2017年仍然被窃听; 正确的解决scheme就是这样打电话
w.setCursor( w.getToolkit().createCustomCursor( new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ), new Point(), null ) );
代替。
根据createCustomCursor
Javadoc页面 ,
创build一个新的自定义光标对象。 如果要显示的图像无效,光标将被隐藏(变成完全透明),热点将被设置为(0,0)。
那会是这样的
w.setCursor( w.getToolkit().createCustomCursor( null, null, null ) );
应该做的伎俩。 不幸的是,有一个错误与这种情况下不处理的代码,请参阅,例如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089 (这是特别的MacOS,但通过浏览源可能很容易发现在任何 Toolkit
平台实现中都没有检查第一个参数的Image
值有效性;有tracker.isErrorAny()
检查,在这种情况下不会执行这个任务),所以传递null
或无效的Image
只是抛出一个NPEx。
在Mac OS上使用LWJGL时,您需要这样做:
System.setProperty("apple.awt.fullscreenhidecursor","true");
frame.setCursor(frame.getToolkit().createCustomCursor( new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0), "null"));
我解决这个问题要容易得多:
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(); } });
在文档中说,如果图像是无效的,那么默认情况下它将是透明的,所以传递一个空的图像将导致一个透明的光标。 但是将null
传递给图像的方法将导致exception。
Toolkit tk= getToolkit(); Cursor transparent = tk.createCustomCursor(tk.getImage(""), new Point(), "trans");