2009-12-31 6 views
42

Existe-t-il un moyen de masquer le curseur (autre que l'utilisation d'une image transparente en tant que curseur)?Comment cacher le curseur dans une application Swing?

+0

Pouvez-vous nous en dire plus? Curseur sur une application Java? –

+0

Oui ... Je voulais cacher le curseur, lorsque l'utilisateur pointe la souris à l'extérieur de JPanel dans JFrame. – Jessy

Répondre

61

Il semble que la classe Cursor ne possède pas de curseur "vide" pour commencer, donc on pourrait définir un nouveau curseur "vide" en utilisant la méthode Toolkit.createCustomCursor.

est ici d'une façon que je l'ai essayé qui semble fonctionner:

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

Modifier

En ce qui concerne le commentaire de tout à l'intérieur du JFrame se termine sans un curseur, il semble que les Component qui sont contenues dans le JFrame finiront par hériter le curseur du conteneur (le JFrame), donc si c'est une exigence d'avoir un certain Component avoir le curseur apparaît, il faudrait régler manuellement le curseur désiré.

Par exemple, s'il y a une JPanel contenue dans le JFrame, alors on pourrait placer le curseur de cette JPanel à défaut du système en utilisant la méthode Cursor.getDefaultCursor:

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

Merci beaucoup pour la réponse Coobird. Mais j'ai un autre problème. J'ai créé JFrame qui contient JPanel, dont la taille est inférieure à celle de JFrame. Je veux seulement que le curseur disparaisse lorsque la souris pointe à l'extérieur du JPanel.Est-ce que cela signifie que lorsque je place le curseur dans le JFrame principal comme invisible, le curseur disparaîtra complètement à l'écran? – Jessy

+0

Salut Jessy, j'ai ajouté la partie sur la façon de définir le JPanel à la valeur par défaut du système dans ma réponse. – coobird

+0

Merci beaucoup CooBird ... Ca marche !! :-) vous avez fait ma journée ... – Jessy

1

je résoudre ce problème beaucoup plus facile:

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

Étrange, mais hier ça marche, mais maintenant ça ne marche pas. Je dois le tester plus de temps. –

3

Lorsque vous utilisez le LWJGL sous Mac OS que vous devez faire ceci:

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 Les boîtes à outils sont encore bugguées en 2017 '; la solution appropriée est donc d'appeler

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

à la place.


Comme par Javadoc page for createCustomCursor,

Crée un nouvel objet curseur personnalisé. Si l'image à afficher n'est pas valide, le curseur sera caché (rendu complètement transparent ) et le point d'accès sera défini sur (0, 0).

Il découlerait de ce que

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

devrait faire l'affaire. Malheureusement, il y a un bug lié à ce cas qui n'est pas traité par le code, voir par ex. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089 (ce particulier est pour MacOS, mais en naviguant sur la source que vous peut facilement constater qu'il n'y a pas de vérification pour la 1ère validité de la valeur param Image dans une des mises en œuvre de la plate-forme Toolkit, il y a vérification tracker.isErrorAny(), qui ne le fait pas est le travail dans ce cas), donc en passant null ou invalide Image jette simplement un NPEx.

2

Dans la documentation, il est indiqué que si l'image n'est pas valide, elle sera transparente par défaut, donc le passage d'une image vide donnera un curseur transparent. Mais le passage null dans la méthode pour l'image entraînera une exception.

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