Как избавиться от курсора мыши в полноэкранном монопольном режиме?

Я работаю над простым движком для 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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
14 071
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Adrian 10.10.2008 18:41

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

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

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

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

Adrian 10.10.2008 22:33

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

davenpcj 14.10.2008 01:59

«Может быть важно, что он создал / установил курсор только после входа в FSEM» Я подтверждаю, что при выполнении этого после setFullScreenWindow работает, но не при вызове раньше.

Manuel Darveau 18.02.2014 05:30

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

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

Adrian 11.10.2008 00:24

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

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

Ответ принят как подходящий

Думаю, я наконец нашел решение:

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

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

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

Adrian 18.04.2013 18:58

Это может быть возраст комментария. Курсор он не скрывал. 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, смешанный режим).

tristan2468 18.04.2013 19:42

Он по-прежнему должен работать правильно, но я не тестировал его на 10.8. Согласно документации разработчика Apple, свойство все еще действует (хотя предположительно по умолчанию установлено значение false). Убедитесь, что вы установили его перед переходом в полноэкранный режим.

Adrian 18.04.2013 19:46

да. Все равно не работает. Я звонил раньше: frame.setUndecorated (true); gd.setFullScreenWindow (кадр); Это фрейм AWT.

tristan2468 18.04.2013 19:52

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

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

Другие вопросы по теме