Pregunta

Estoy trabajando en un motor de juego 2D simple en Java, y no tengo problemas con FSEM, estrategias de búfer, etc. Mi problema es con el cursor del mouse. En modo ventana, puedo ocultar el cursor del mouse, no hay problema, usando setCursor () de mi JFrame para establecer un cursor totalmente transparente. Sin embargo, después de una llamada a device.setFullScreenWindow (this) para ingresar a FSEM, el cursor del mouse regresa, y las llamadas posteriores a setCursor () para configurarlo nuevamente en mi cursor en blanco no tienen efecto. Llamar a device.setFullScreenWindow (null) me permite deshacerme del cursor nuevamente; solo mientras estoy en FSEM no puedo deshacerme de él.

Estoy trabajando con JDK 6, la plataforma de destino es JDK 5+.

ACTUALIZACIÓN: he realizado algunas pruebas más y parece que este problema se produce en MacOS X 10.5 con Java 6u7, pero no en Windows XP SP3 con Java 6u7. Por lo tanto, podría ser un error en la versión para Mac de la JVM.

¿Fue útil?

Solución 3

Creo que finalmente encontré la solución:

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

Esta es una propiedad del sistema propiedad de Apple que oculta el cursor del mouse cuando una aplicación está en modo de pantalla completa. Es la única forma en que he encontrado para solucionarlo.

Otros consejos

Intente crear un cursor invisible personalizado:

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

Un desarrollador encontró una forma de evitarlo al crear un cursor de un píxel a partir de un GIF transparente.

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

Sé que lo intentaste, pero el suyo está abordando específicamente el tema del modo de pantalla completa, exactamente como tú dices, así que quizás hay algo que ha hecho que tú no has hecho.

Esto es lo que ha estado funcionando para mí:

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

Por supuesto, no lo he probado en Mac (todavía), solo en Windows. Pero cuando utilicé los métodos comunes, obtuve el cursor como un cuadro negro, así que utilicé el código sobre crear un cuadro transparente y lo configuré como el cursor. Por supuesto, debe usar el método setCursor en un objeto AWT (como el Marco de su aplicación) para configurar este cursor oculto. Aquí está mi método hideMouse ('fr' es mi Frame):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}

No sé si este conocimiento se aplica, pero en una vieja aplicación VB6 tuve el mismo problema y me deshice de él moviendo el cursor fuera de la pantalla dándole algunos valores muy grandes.
Espero que ayude.

Si está ejecutando solo en Windows, parece que tendrá que llamar a ShowCursor (FALSE) a través de JNI. Al menos, para que el cursor se oculte completo.

Aquí hay un código que crea el cursor 1x1. Funciona para mí, aunque todavía obtengo un cursor 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);

Específicamente para su problema de Mac, a través de JNI puede usar lo siguiente:

Quartz Referencia de servicios de visualización - CGDisplayHideCursor

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top