Как избавиться от курсора мыши в полноэкранном монопольном режиме? - PullRequest
6 голосов
/ 10 октября 2008

Я работаю над простым 2D игровым движком на Java, и у меня нет проблем с FSEM, буферными стратегиями и т. Д .; моя проблема с курсором мыши. В оконном режиме я могу без проблем скрыть курсор мыши, используя setCursor () из моего JFrame для установки полностью прозрачного курсора. Однако после вызова device.setFullScreenWindow (this) для перехода в FSEM курсор мыши возвращается, и последующие вызовы setCursor (), чтобы установить его обратно в мой пустой курсор, не имеют никакого эффекта. Вызов device.setFullScreenWindow (null) позволяет мне снова избавиться от курсора - я не могу от него избавиться только во время нахождения в FSEM.

Я работаю под JDK 6, целевая платформа - JDK 5 +.

ОБНОВЛЕНИЕ: Я провел еще несколько тестов, и похоже, что эта проблема возникает в MacOS X 10.5 с Java 6u7, но не в Windows XP SP3 с Java 6u7. Таким образом, это может быть ошибка в Mac-версии JVM.

Ответы [ 7 ]

10 голосов
/ 10 ноября 2010

Попробуйте создать пользовательский невидимый курсор:

    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);
5 голосов
/ 10 октября 2008

Один разработчик нашел способ обойти это, создав однопиксельный курсор из прозрачного GIF-файла.

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

Я знаю, что вы пытались это сделать, но он специально решает проблему полноэкранного режима, именно так, как вы говорите, так что, возможно, он сделал что-то, чего у вас нет.

4 голосов
/ 15 октября 2008

Я думаю, что наконец нашел решение:

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

Это собственное системное свойство Apple, которое скрывает курсор мыши, когда приложение находится в полноэкранном режиме. Это единственный способ исправить это.

1 голос
/ 22 июня 2009

Вот что у меня работает:

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. Но когда я использовал обычные методы, я получал курсор в виде черного ящика, поэтому я использовал код выше для создания прозрачного ящика и вместо него установил его в качестве курсора. Конечно, вы должны использовать метод setCursor для объекта AWT (например, Frame вашего приложения), чтобы установить этот hiddenCursor. Вот мой метод hideMouse ('fr' - это мой кадр):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}
0 голосов
/ 11 октября 2008

Специально для вашей проблемы Mac, через JNI вы можете использовать следующее:

Справочник по службам кварцевого дисплея - CGDisplayHideCursor

0 голосов
/ 10 октября 2008

Если вы работаете только в Windows, похоже, вам нужно вызвать ShowCursor (FALSE) через JNI. По крайней мере, чтобы сделать курсор полностью скрытым.

Вот некоторый код, который создает курсор 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);
0 голосов
/ 10 октября 2008

Я не знаю, применимы ли эти знания, но в старом приложении VB6 у меня была та же проблема, и я избавился от нее, перемещая курсор за пределы экрана, давая ему очень большие значения.
Надеюсь, это поможет.

...