Como esconder o cursor em um aplicativo Swing?

Existe uma maneira de ocultar o cursor (além de usar a imagem transparente como um cursor)?

Parece que a class Cursor não tem um cursor “em branco” para começar, então pode-se definir um novo cursor “em branco” usando o método Toolkit.createCustomCursor .

Aqui está uma maneira que eu tentei 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

Com relação ao comentário sobre tudo dentro do JFrame terminando sem um cursor, parece que os Component contidos no JFrame acabarão herdando o cursor do container (o JFrame ), então se é necessário ter um certo Component tem o cursor aparecer, um teria que definir manualmente o cursor desejado.

Por exemplo, se houver um JPanel contido no JFrame , pode-se configurar o cursor desse JPanel para o padrão do sistema usando o método Cursor.getDefaultCursor :

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

Os kits de ferramentas AWT ainda estão com defeito em 2017 ‘; a solução adequada é, portanto, chamar

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

em vez de.


De acordo com a página do Javadoc para createCustomCursor ,

Cria um novo object de cursor personalizado. Se a imagem a exibir for inválida, o cursor ficará oculto (totalmente transparente) e o ponto de access será definido como (0, 0).

Daqui resultaria disso que

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

deve fazer o truque. Infelizmente, há um bug relacionado a este caso que NÃO é tratado pelo código, veja por exemplo http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089 (isso é para MacOS, mas navegando pela fonte você pode facilmente descobrir que não há verificação da validade do valor de 1ª parâmetro em qualquer implementação de plataforma do Toolkit ; há verificação de tracker.isErrorAny() , que não faz o trabalho nesse caso), portanto, passando null ou inválido Image simplesmente lança um NPEx.

Ao usar o LWJGL no Mac OS, você precisa fazer isso:

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

Na documentação, diz que se a imagem for inválida, ela será transparente por padrão, portanto, passar uma imagem vazia resultará em um cursor transparente. Mas Passar null para o método da imagem resultará em uma exceção.

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

Eu resolvo este problema muito mais 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(); } });