2008-10-10 156 views
7

我正在研究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。所以,它可能是JVM的Mac版本中的一个错误。

回答

4

我想我终于找到了解决办法:

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

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

0

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

+0

的问题是,我需要鼠标输入,我只是想隐藏光标图像在屏幕上。 – Adrian 2008-10-10 14:41:57

+0

对不起,误解了你:( – 2008-10-10 17:59:53

5

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

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

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

+0

这或多或少是我在做什么,但我正在创建我自己的1像素透明光标图像,我将它转换为使用预先制作的1px透明GIF,并且它没有帮助 - 仍然可以在窗口模式下工作,但是我不能在全屏模式下移除光标 – Adrian 2008-10-10 18:33:22

+1

也许只有在进入FSEM之后才创建/设置光标是很重要的,例如在窗口上,游标也是非常平台的 – davenpcj 2008-10-13 21:59:59

+0

“也许这是很重要的,他只有在进入FSEM后才创建/设置光标”我确认在* setFullScreenWindow工作之后这么做*但是如果之前调用不了, – 2014-02-18 01:30:48

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