46 votes

Comment masquer le curseur dans une application Swing ?

Existe-t-il un moyen de masquer le curseur (autre que d'utiliser une image transparente comme curseur) ?

Je veux cacher le curseur, lorsque l'utilisateur pointe la souris en dehors du JPanel dans le JFrame.

68voto

coobird Points 70356

Il semble que le Cursor n'a pas de curseur "vierge" au départ, on peut donc définir un nouveau curseur "vierge" à l'aide de l'attribut Toolkit.createCustomCursor méthode.

Voici une méthode que j'ai essayée et 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 sur tout ce qui se trouve à l'intérieur du JFrame se retrouvant sans curseur, il semble que la Component qui sont contenus dans le JFrame finira par hériter du curseur du conteneur (l'élément JFrame ), donc s'il est nécessaire d'avoir une certaine Component pour que le curseur apparaisse, il faut définir manuellement le curseur souhaité.

Par exemple, s'il existe un JPanel contenu dans le JFrame alors on pourrait mettre le curseur de ce JPanel à la valeur par défaut du système en utilisant l'option [Cursor.getDefaultCursor](http://java.sun.com/javase/6/docs/api/java/awt/Cursor.html#getDefaultCursor()) méthode :

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

6voto

vaxquis Points 2122

tl;dr AWT Toolkits are still bugged in 2017' ; la bonne solution est donc d'appeler

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

à la place.


Conformément à Page de Javadoc pour 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 la zone sensible sera définie sur (0, 0). complètement transparent), et le point chaud sera défini sur (0, 0).

Il s'ensuit que

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

devrait faire l'affaire. Malheureusement, il y a un bogue lié à ce cas qui n'est PAS géré par le code, voir par ex. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089 (ce cas particulier est pour MacOS, mais en parcourant la source vous pouvez facilement trouver qu'il n'y a pas de vérification pour 1st param Image validité de la valeur dans cualquier de la Toolkit les implémentations de la plate-forme ; il y a tracker.isErrorAny() qui ne fait pas son travail dans ce cas), donc en passant null ou invalide Image lance simplement un NPEx.

3voto

mcb Points 707

Lorsque vous utilisez LWJGL sous Mac OS, vous devez faire cela :

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

3voto

Dennis Points 11
frame.setCursor(frame.getToolkit().createCustomCursor(
            new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0),
            "null"));

1voto

swap_i Points 61

Je résous ce problème beaucoup plus facilement :

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();
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X