2008-10-10 6 views
7

Sto lavorando a un semplice motore di gioco 2D in Java e non ho problemi con FSEM, strategie di buffer e così via; il mio problema è con il cursore del mouse. In modalità finestra, posso nascondere il cursore del mouse, nessun problema, usando setCursor() dal mio JFrame per impostare un cursore completamente trasparente. Tuttavia, dopo una chiamata a device.setFullScreenWindow (this) per andare in FSEM, il cursore del mouse torna indietro e le successive chiamate a setCursor() per riportarlo al mio cursore vuoto non hanno alcun effetto. Chiamare device.setFullScreenWindow (null) mi permette di sbarazzarmi nuovamente del cursore - è solo quando sono in FSEM che non riesco a liberarmene.Come si elimina il cursore del mouse in modalità esclusiva a schermo intero?

Sto lavorando sotto JDK 6, la piattaforma di destinazione è JDK 5+.

UPDATE: Ho eseguito altri test e sembra che questo problema si verifichi con MacOS X 10.5 con Java 6u7, ma non con Windows XP SP3 con Java 6u7. Quindi, potrebbe essere un bug nella versione Mac di JVM.

risposta

4

Penso di aver finalmente trovato la soluzione:

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

Questo è un Proprietà di sistema proprietaria Apple che nasconde il cursore del mouse quando un'applicazione è in modalità a schermo intero. È l'unico modo per risolverlo.

+0

Questo non sembra funzionare per me. – tristan2468

+0

@ tristan2468 che problema hai avuto? Anche quale versione di Java e quale versione di MacOS? Noterai che ora ha 5 anni e potrebbe non essere aggiornato. – Adrian

+0

Potrebbe essere l'età del commento. Non ha nascosto il cursore. Mountain Lion 10.8.3, Java: versione java "1.6.0_43" Java (TM) SE Runtime Environment (build 1.6.0_43-b01-447-11M4203) Java HotSpot (TM) Server VM a 64 bit (build 20.14- b01-447, modalità mista). – tristan2468

0

Non so se questa conoscenza si applica ma in una vecchia app VB6 ho avuto lo stesso problema e mi sono liberato spostando il cursore fuori dallo schermo dandogli alcuni valori molto grandi.
Spero che aiuti.

+0

Il problema è che ho bisogno l'input del mouse, voglio solo per nascondere il immagine del cursore sullo schermo. – Adrian

+0

Mi dispiace, ti ho frainteso :( –

5

Uno sviluppatore ha trovato un modo per aggirarlo creando un cursore di un pixel da una GIF trasparente.

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

So che provato, ma la sua è specificamente affrontare la questione della modalità a schermo intero, esattamente come dici tu, quindi forse c'è qualcosa che ha fatto che non si ha.

+0

Questo è più o meno quello che stavo facendo, ma stavo creando la mia immagine del cursore trasparente a 1 pixel al volo. L'ho cambiata per usare una GIF trasparente 1px pre-fatta, e non ha aiutato - funziona ancora in modalità finestra ma non riesco a bandire il cursore in modalità a schermo intero – Adrian

+1

Forse è significativo che abbia creato/impostato il cursore solo dopo aver inserito FSEM. L'esempio era anche su Windows, i cursori sono molto piattaforma specifico, quindi probabilmente hai ragione: – davenpcj

+0

"Forse è significativo che abbia creato/impostato il cursore solo dopo aver inserito FSEM" confermo che farlo * dopo * il setFullScreenWindow funziona ma non se la chiama prima. –

0

Se si esegue solo su Windows, sembra che sarà necessario chiamare ShowCursor (FALSE) tramite JNI. Almeno, per nascondere il cursore completo.

Ecco un codice che crea il cursore 1x1. Funziona per me, anche se ottengo ancora un cursore 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

Questo è quasi esattamente quello Sto facendo, e mentre funziona perfettamente in modalità finestra, non funziona in modalità a schermo intero.Il cursore si mostra ancora fino a quando non esco dalla modalità a schermo intero, quindi sono in grado di nasconderla di nuovo, usi la stessa tecnica che hai descritto. – Adrian

1

Ecco cosa ha lavorato per me:

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

Certo, non ho ancora testato su Mac (ancora), solo Windows. Ma quando ho usato i metodi comuni stavo ottenendo il cursore come una scatola nera, quindi uso il codice sopra la casella trasparente e l'ho impostato come il cursore. Ovviamente devi usare il metodo setCursor su un oggetto AWT (come il Frame della tua app) per impostare questo hiddenCursor.Ecco il mio metodo hideMouse ('fr' è il mio Frame):

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

provare a creare un cursore invisibile personalizzato:

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

Molto bello. Questo funziona. – tristan2468