web-dev-qa-db-fra.com

Comment masquer le curseur dans une application Swing?

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

44
Jessy

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 le Toolkit.createCustomCursor méthode.

Voici une façon dont j'ai essayé 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 dans le JFrame se terminant sans curseur, il semble que les Component qui sont contenus dans le JFrame finiront par hériter du curseur du conteneur ( JFrame), donc s'il est nécessaire d'avoir un certain Component pour que le curseur apparaisse, il faudrait régler manuellement le curseur souhaité.

Par exemple, s'il y a un JPanel contenu dans le JFrame, alors on pourrait placer le curseur de ce JPanel sur la valeur par défaut du système en utilisant Cursor.getDefaultCursor méthode:

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

tl; dr Les kits d'outils AWT sont toujours buggés en 2017 '; la bonne solution est donc d'appeler

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

au lieu.


Selon page Javadoc pour createCustomCursor ,

Crée un nouvel objet curseur personnalisé. Si l'image à afficher n'est pas valide, le curseur sera masqué (rendu complètement transparent) et le hotspot sera réglé sur (0, 0).

Il en découlerait que

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

devrait faire l'affaire. Malheureusement, il y a un bug lié à ce cas NON géré par le code, voir par exemple http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=7150089 (ceci est particulièrement pour MacOS, mais en parcourant la source, vous pouvez facilement trouver qu'il n'y a pas de vérification pour le 1er paramètre Image Validité de la valeur dans toute des implémentations de la plate-forme Toolkit; il y a tracker.isErrorAny() vérification, ce qui ne dans ce cas), donc passer null ou invalide Image lance simplement un NPEx.

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

Lorsque vous utilisez le LWJGL sous Mac OS, vous devez procéder comme suit:

System.setProperty("Apple.awt.fullscreenhidecursor","true");
3
Lenar Hoyt

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

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

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