如何隐藏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");