我正在用 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 with Java 6u7 下。因此,这可能是 Mac 版本 JVM 中的一个错误。

有帮助吗?

解决方案 3

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

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

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

其他提示

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

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

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

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

我知道你试过了,但是他特意解决了全屏模式的问题,正如你所说的那样,所以也许他已经完成了你没有做过的事情。

这是对我有用的:

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 方法来设置此隐藏游标。这是我的 hideMouse 方法(“fr”是我的框架):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}

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

如果您只在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);

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

Quartz显示服务参考 - CGDisplayHideCursor

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top