2008-10-10 17 views
7

Estoy trabajando en un simple motor de juegos 2D en Java, y no tengo problemas con FSEM, estrategias de almacenamiento intermedio, etc. mi problema es con el cursor del mouse En modo ventana, puedo ocultar el cursor del mouse, no hay problema, usando setCursor() desde mi JFrame para establecer un cursor totalmente transparente. Sin embargo, después de una llamada a device.setFullScreenWindow (this) para ir a FSEM, el cursor del mouse regresa, y las llamadas posteriores a setCursor() para volver a establecerlo en mi cursor en blanco no tienen efecto. Llamar a device.setFullScreenWindow (null) me permite deshacerme del cursor otra vez; solo cuando estoy en FSEM no puedo deshacerme de él.¿Cómo me deshago del cursor del mouse en el modo exclusivo de pantalla completa?

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

ACTUALIZACIÓN: He hecho más pruebas, y parece que este problema ocurre 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 de Mac de la JVM.

Respuesta

4

Creo que por fin he encontrado la solución:

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

Ésta 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 que he encontrado para arreglarlo.

+0

Esto no pareció funcionar para mí. – tristan2468

+0

@ tristan2468 ¿Qué problema tenías con eso? Además, ¿qué versión de Java y qué versión de MacOS? Notarás que ahora tiene 5 años y puede que esté desactualizado. – Adrian

+0

Podría ser la edad del comentario. No escondió el cursor. Mountain Lion 10.8.3, Java: versión java "1.6.0_43" Java (TM) SE Runtime Environment (compilación 1.6.0_43-b01-447-11M4203) Java HotSpot (TM) Servidor de 64 bits VM (compilación 20.14- b01-447, modo mixto). – tristan2468

0

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

+0

El problema es que necesito la entrada del ratón, sólo quiero ocultar la imagen del cursor en la pantalla. – Adrian

+0

Lo siento, lo he entendido mal :( –

5

Un desarrollador encontró una forma de evitarlo creando un cursor de un píxel de un GIF transparente.

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

Sé que intentó, pero su es abordar específicamente el problema del modo de pantalla completa, tal y como se dice, por lo que tal vez hay algo que ha hecho que no tiene.

+0

Eso es más o menos lo que estaba haciendo, pero estaba creando mi propia imagen de cursor transparente de 1 píxel sobre la marcha. Lo cambié para usar un GIF transparente de 1px prefabricado, y no ayudó - todavía funciona en modo ventana pero no puedo desterrar el cursor en modo de pantalla completa. – Adrian

+1

Quizás es significativo que haya creado/establecido el cursor solo después de ingresar a FSEM. El ejemplo fue en Windows, también, los cursores son muy plataforma específico, por lo que probablemente tenga razón. – davenpcj

+0

"Quizás sea significativo que haya creado/establecido el cursor solo después de ingresar a FSEM" Confirmo que hacerlo * después de * el setFullScreenWindow funciona pero no si se llamó antes. –

0

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

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

Esto es casi exactamente lo Estoy haciendo, y aunque funciona perfectamente en modo ventana, no funciona en modo de pantalla completa. El cursor aún aparece hasta que salgo del modo de pantalla completa, luego puedo ocultarlo de nuevo, usi aplicando la misma técnica que describiste – Adrian

1

Esto es lo que ha estado trabajando 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, yo no lo he probado en Mac (aún), sólo para Windows. Pero cuando utilicé los métodos comunes conseguí el cursor como caja negra, así que utilizo el código sobre el cuadro Crear una transparencia 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 hiddenCursor.Aquí es mi método HideMouse ('fr' es mi Frame):

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

intente crear un cursor personalizado invisibles:

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

Muy agradable. Esto funciona. – tristan2468

Cuestiones relacionadas