如何在全屏独占模式下摆脱鼠标光标?

时间:2008-10-10 14:31:03

标签: java mouse fullscreen mouse-cursor

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

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

更新:我已经做了一些测试,看起来这个问题出现在Mac OS X 10.5 w / Java 6u7下,但不是在带有Java 6u7的Windows XP SP3下。因此,它可能是Mac版JVM中的一个错误。

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分: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());
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分: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);

答案 6 :(得分:0)

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

Quartz Display Services Reference - CGDisplayHideCursor