2008-10-10 2 views
7

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

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

UPDATE: Я проверил еще несколько тестов, и похоже, что эта проблема возникает в MacOS X 10.5 w/Java 6u7, но не под Windows XP SP3 с Java 6u7. Таким образом, это может быть ошибка в версии JVM для Mac.

ответ

4

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

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

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

+0

Это, похоже, не работает для меня. – tristan2468

+0

@ tristan2468 какая у вас проблема? Также какая версия Java и какая версия MacOS? Вы заметите, что сейчас 5 лет и могут быть устаревшими. – Adrian

+0

Это может быть возраст комментария. Он не скрывал курсор. Mountain Lion 10.8.3, Java: версия java «1.6.0_43» Рабочая среда Java (TM) SE (сборка 1.6.0_43-b01-447-11M4203) 64-разрядная серверная виртуальная машина Java HotSpot TM (сборка 20.14- b01-447, смешанный режим). – tristan2468

0

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

+0

Проблема заключается в том, что мне нужно ввод мыши, я просто хочу, чтобы скрыть курсора на экране. – Adrian

+0

Извините, вы неправильно поняли :( –

5

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

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

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

+0

Это более или менее то, что я делал, но я создавал свое собственное 1-пиксельное прозрачное изображение курсора на лету. Я переключил его на использование готового 1px прозрачного GIF, и он не помогло - все еще работает в оконном режиме, но я не могу изгнать курсор в полноэкранном режиме. – Adrian

+1

Может быть, важно, что он создал/установил курсор только после входа в FSEM. Пример был также в окнах, курсоры - очень платформа конкретный, так что вы, вероятно, правы. – davenpcj

+0

«Возможно, важно, что он создал/установил курсор только после ввода FSEM« Я подтверждаю, что делаю это * после того, как * setFullScreenWindow работает, но не в том случае, если звонит раньше. –

0

Если вы работаете только с 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

Это почти что Я работаю, и пока он отлично работает в оконном режиме, он не работает в полноэкранном режиме. Курсор все еще отображается до тех пор, пока я не выйду из полноэкранного режима, тогда я смогу скрыть его снова, usi что вы описали. – Adrian

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

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

Очень приятно. Это работает. – tristan2468

Смежные вопросы