如何在Swing应用程序中隐藏光标?

2022-08-31 20:32:51

有没有办法隐藏光标(除了使用透明图像作为光标)?

我想隐藏光标,当用户在JFrame中的JPanel之外指向JPanel时。


答案 1

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);

编辑

关于没有游标的结局内的所有内容的注释,似乎包含在中的s最终将继承容器的光标(the ),因此,如果需要有一定的光标出现,则必须手动设置所需的游标。JFrameComponentJFrameJFrameComponent

例如,如果 中包含一个,则可以使用 Cursor.getDefaultCursor 方法将其游标设置为系统的默认值:JPanelJFrameJPanel

JPanel p = ...
// Sets the JPanel's cursor to the system default.
p.setCursor(Cursor.getDefaultCursor());

答案 2

tl;博士AWT工具包在2017年仍然存在问题。因此,正确的解决方案是调用

  w.setCursor( w.getToolkit().createCustomCursor(
                   new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ),
                   new Point(),
                   null ) );

相反。


根据Javadoc页面的createCustomCursor

创建新的自定义游标对象。如果要显示的图像无效,光标将被隐藏(完全透明),热点将设置为(0,0)。

由此可知,

w.setCursor( w.getToolkit().createCustomCursor( null, null, null ) );

应该做这个把戏。可悲的是,有一个与此情况相关的错误不是由代码处理的,例如 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089(这个特定是针对MacOS的,但是通过浏览源代码,您可能会很容易发现在任何平台实现中都没有检查1st参数值有效性;有检查,在这种情况下不会完成它的工作), 因此,通过或无效只会抛出一个 NPEx。ImageToolkittracker.isErrorAny()nullImage


推荐