Я работаю над простым движком для 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. Так что, возможно, это ошибка в версии JVM для Mac.




Я не знаю, применимы ли эти знания, но в старом приложении VB6 у меня была такая же проблема, и я избавился от нее, перемещая курсор за пределы экрана, давая ему очень большие значения. Надеюсь, это поможет.
Один разработчик нашел способ обойти это, создав однопиксельный курсор из прозрачного GIF.
http://sevensoft.livejournal.com/23460.html
Я знаю, что вы пробовали это, но он конкретно обращается к проблеме полноэкранного режима, именно так, как вы говорите, так что, возможно, он сделал что-то, чего не сделали вы.
Это более или менее то, что я делал, но я создавал свое собственное прозрачное изображение курсора размером 1 пиксель на лету. Я переключил его на использование предварительно созданного прозрачного GIF размером 1 пиксель, и это не помогло - все еще работает в оконном режиме, но я не могу прогнать курсор в полноэкранном режиме.
Может показательно, что он создал / установил курсор только после входа в FSEM. Пример был также для Windows, курсоры очень специфичны для платформы, так что вы, вероятно, правы.
«Может быть важно, что он создал / установил курсор только после входа в FSEM» Я подтверждаю, что при выполнении этого после setFullScreenWindow работает, но не при вызове раньше.
Если вы работаете только в 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);
Это почти именно то, что я делаю, и хотя он отлично работает в оконном режиме, он не работает в полноэкранном режиме. Курсор все еще отображается, пока я не выйду из полноэкранного режима, а затем я снова могу скрыть его, используя ту же технику, которую вы описали.
Специально для вашей проблемы Mac через JNI вы можете использовать следующее:
Справочник по службам кварцевых дисплеев - CGDisplayHideCursor
Думаю, я наконец нашел решение:
System.setProperty("apple.awt.fullscreenhidecursor","true");
Это проприетарное системное свойство Apple, которое скрывает курсор мыши, когда приложение находится в полноэкранном режиме. Я нашел единственный способ исправить это.
@ tristan2468 какая у тебя с ним проблема? Также какая версия Java и какая версия MacOS? Вы заметите, что ему уже 5 лет, и, возможно, он устарел.
Это может быть возраст комментария. Курсор он не скрывал. Mountain Lion 10.8.3, Java: версия Java "1.6.0_43" Java (TM) SE Runtime Environment (сборка 1.6.0_43-b01-447-11M4203) 64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 20.14-b01- 447, смешанный режим).
Он по-прежнему должен работать правильно, но я не тестировал его на 10.8. Согласно документации разработчика Apple, свойство все еще действует (хотя предположительно по умолчанию установлено значение false). Убедитесь, что вы установили его перед переходом в полноэкранный режим.
да. Все равно не работает. Я звонил раньше: frame.setUndecorated (true); gd.setFullScreenWindow (кадр); Это фрейм AWT.
Вот что у меня работало:
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());
}
}
Попробуйте создать собственный невидимый курсор:
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);
Проблема в том, что мне нужен ввод с помощью мыши, я просто хочу скрыть изображение курсора на экране.