5

我正在使用 Java 开发一个简单的 2D 游戏引擎,并且在 FSEM、缓冲策略等方面没有遇到任何问题;我的问题是鼠标光标。在窗口模式下,我可以隐藏鼠标光标,没问题,通过使用我的 JFrame 中的 setCursor() 来设置一个完全透明的光标。但是,在调用 device.setFullScreenWindow(this) 进入 FSEM 后,鼠标光标又回来了,随后调用 setCursor() 将其设置回我的空白光标没有任何效果。调用 device.setFullScreenWindow(null) 可以让我再次摆脱光标 - 只有当我在 FSEM 中时,我才能摆脱它。

我在 JDK 6 下工作,目标平台是 JDK 5+。

更新:我做了一些更多的测试,看起来这个问题发生在 MacOS X 10.5 w/Java 6u7 下,而不是在 Windows XP SP3 和 Java 6u7 下。因此,它可能是 Mac 版本的 JVM 中的错误。

4

7 回答 7

11

尝试创建一个自定义的不可见光标:

    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Point hotSpot = new Point(0,0);
    BufferedImage cursorImage = new BufferedImage(1, 1, BufferedImage.TRANSLUCENT); 
    Cursor invisibleCursor = toolkit.createCustomCursor(cursorImage, hotSpot, "InvisibleCursor");        
    setCursor(invisibleCursor);
于 2010-11-10T04:21:07.530 回答
5

一位开发人员通过从透明 GIF 中创建一个像素光标找到了解决方法。

http://sevensoft.livejournal.com/23460.html

我知道您尝试过,但正如您所说,他专门解决了全屏模式的问题,所以也许他做了一些您没有做过的事情。

于 2008-10-10T16:12:37.677 回答
4

我想我终于找到了解决方案:

System.setProperty("apple.awt.fullscreenhidecursor","true");

这是 Apple 专有的系统属性,当应用程序处于全屏模式时隐藏鼠标光标。这是我找到修复它的唯一方法。

于 2008-10-15T17:42:13.547 回答
1

这是对我有用的:

Toolkit toolkit = Toolkit.getDefaultToolkit();

// get the smallest valid cursor size
Dimension dim = toolkit.getBestCursorSize(1, 1);

// create a new image of that size with an alpha channel
BufferedImage cursorImg = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB);

// get a Graphics2D object to draw to the image
Graphics2D g2d = cursorImg.createGraphics();

// set the background 'color' with 0 alpha and clear the image
g2d.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.0f));
g2d.clearRect(0, 0, dim.width, dim.height);

// dispose the Graphics2D object
g2d.dispose();

// now create your cursor using that transparent image
hiddenCursor = toolkit.createCustomCursor(cursorImg, new Point(0,0), "hiddenCursor");

当然,我还没有在 Mac 上测试过它,只有 Windows。但是当我使用常用​​方法时,我将光标设置为黑框,所以我使用上面的代码创建一个透明框并将其设置为光标。当然,您必须在 AWT 对象(例如您的应用程序的 Frame)上使用 setCursor 方法来设置此 hiddenCursor。这是我的 hideMouse 方法('fr' 是我的框架):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}
于 2009-06-22T16:21:16.883 回答
0

我不知道这些知识是否适用,但在一个旧的 VB6 应用程序中我遇到了同样的问题,我摆脱了它,将光标移出屏幕,给它一些非常大的值。
希望能帮助到你。

于 2008-10-10T14:37:04.907 回答
0

如果您仅在 Windows 上运行,您似乎需要通过 JNI 调用 ShowCursor(FALSE)。至少,要使光标隐藏完整。

这是一些创建 1x1 光标的代码。它对我有用,虽然我仍然得到一个 1x1 光标。

 Toolkit toolkit = Toolkit.getDefaultToolkit();
 Dimension dim = toolkit.getBestCursorSize(1,1);
 transCursor = toolkit.createCustomCursor(gc.createCompatibleImage(dim.width, dim.height),
     new Point(0, 0), "transCursor");
 ((Component)mainFrame).setCursor(transCursor);
于 2008-10-10T19:55:52.203 回答
0

专门针对您的 Mac 问题,通过 JNI,您可以使用以下内容:

石英显示服务参考 - CGDisplayHideCursor

于 2008-10-10T20:43:51.733 回答