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