2009-12-31 9 views
42

¿Hay alguna manera de ocultar el cursor (que no sea el uso de una imagen transparente como cursor)?¿Cómo ocultar el cursor en una aplicación Swing?

+0

¿Puede seguir? Cursor en una aplicación java? –

+0

yes..Intenté ocultar el cursor cuando el usuario señala el mouse fuera de JPanel en JFrame. – Jessy

Respuesta

61

Parece que la clase Cursor no tiene un cursor "en blanco" para comenzar, por lo que se podría definir un nuevo cursor "en blanco" con el método Toolkit.createCustomCursor.

Ésta es una forma He intentado que parece funcionar:

// Transparent 16 x 16 pixel cursor image. 
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 

// Create a new blank cursor. 
Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
    cursorImg, new Point(0, 0), "blank cursor"); 

// Set the blank cursor to the JFrame. 
mainJFrame.getContentPane().setCursor(blankCursor); 

Editar

En cuanto al comentario sobre todo dentro de la JFrame quedarse sin un cursor, parece que los Component s que están contenidos en el JFrame terminarán heredando el cursor del contenedor (el JFrame), por lo que si es un requisito tener un cierto Component haga que aparezca el cursor, uno debería configurar manualmente el cursor deseado.

Por ejemplo, si hay un JPanel contenida en el JFrame, entonces se podría definir el cursor de ese JPanel de una omisión del sistema utilizando el Cursor.getDefaultCursor método:

JPanel p = ... 
// Sets the JPanel's cursor to the system default. 
p.setCursor(Cursor.getDefaultCursor()); 
+0

Muchas gracias por la respuesta Coobird. Pero tengo otro problema. Creé JFrame que contiene JPanel, cuyo tamaño es más pequeño que el JFrame. Solo quiero que el cursor desaparezca cuando el mouse apunte fuera del JPanel. ¿Eso significa que cuando coloque el cursor en el JFrame principal como invisible, el cursor desaparecerá por completo en la pantalla? – Jessy

+0

Hola Jessy, he agregado la parte sobre cómo configurar el JPanel al sistema predeterminado en mi respuesta. – coobird

+0

Muchas gracias CooBird ... ¡Funciona! :-) hiciste mi día ... – Jessy

1

puedo solucionar este problema mucho más fácil:

final Timer cursorTimer = new Timer(2000, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     getContentPane().setCursor(null); 
    } 
}); 
cursorTimer.start(); 

addMouseMotionListener(new MouseMotionAdapter() { 
    @Override 
    public void mouseMoved(MouseEvent e) { 
     getGlassPane().setCursor(Cursor.getDefaultCursor()); 
     cursorTimer.restart(); 
    } 
}); 
+0

Extraño, pero ayer funciona, pero ahora no funciona. Necesito probarlo más tiempo. –

3

Cuando se utiliza el LWJGL en Mac OS que tiene que hacer esto:

System.setProperty("apple.awt.fullscreenhidecursor","true"); 
3
frame.setCursor(frame.getToolkit().createCustomCursor(
      new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0), 
      "null")); 
4

tl; dr AWT Los kits de herramientas todavía están dañados en 2017 '; la solución adecuada es, por lo tanto, llamar al

w.setCursor(w.getToolkit().createCustomCursor(
        new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB), 
        new Point(), 
        null)); 

en su lugar.


Según Javadoc page for createCustomCursor,

Crea un nuevo objeto de encargo del cursor. Si la imagen que se visualiza no es válida, el cursor estará oculto ( completamente transparente) y el punto de acceso se establecerá en (0, 0).

De ello se sigue de ello que

w.setCursor(w.getToolkit().createCustomCursor(null, null, null)); 

debe hacer el truco. Lamentablemente, hay un error relacionado con este caso que NO maneja el código, ver p. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089 (este particular es para MacOS, pero al navegar por la fuente puede encontrar fácilmente que no hay ninguna comprobación para el 1er parámetro Image valor validez en de las implementaciones de la plataforma Toolkit; está tracker.isErrorAny() comprobando, lo que no funciona en este caso), por lo que pasa null o no válido Image simplemente arroja un NPEx.

2

En la documentación, dice que si la imagen no es válida, entonces será transparente por defecto, por lo que pasar una imagen vacía dará como resultado un cursor transparente. Pero pasar null en el método para la imagen dará como resultado una excepción.

Toolkit tk= getToolkit(); 
Cursor transparent = tk.createCustomCursor(tk.getImage(""), new Point(), "trans"); 
Cuestiones relacionadas