IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

comment changer le curseur par defaut?


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé Avatar de ABN84
    Inscrit en
    Octobre 2007
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2007
    Messages : 410
    Par défaut comment changer le curseur par defaut?
    bonjour,
    j'ai besoin de changer le curseur par defaut, pour cela j'utilise 4 images png 18x18.
    j'ecrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        private void SelectButtonActionPerformed(java.awt.event.ActionEvent evt) {                
            //Cursor:
            setCursor(SelectCursor);
        }
     
    [...]
     
            Image SelectIc=(new javax.swing.ImageIcon(getClass().getResource("/image/select.PNG"))).getImage();
     
     
            Toolkit tk = Toolkit.getDefaultToolkit();
            Cursor SelectCursor = tk.createCustomCursor(SelectIc, new Point(18, 18), "");
    le code fonctionne, ce qui me pose probleme, c'est la taille de l'icone, ce n'est pas la taille du PNG, elle est plus grande, ce qui fait qu'on voit les pixels 1 par 1, et c'est vraiment pas joli. comment puis-je resoudre ceci?
    merci

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Tu peux utiliser getBestCursorSize() pour savoir quelle taille de curseur tu vas obtenir à partir de ton image. Ensuite tu crées une image de la bonne taille dans laquelle tu recopies ton image initiale.

    cf. http://www.jguru.com/faq/view.jsp?EID=9958

  3. #3
    Membre éclairé Avatar de ABN84
    Inscrit en
    Octobre 2007
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2007
    Messages : 410
    Par défaut
    bonjour,
    ça n'a pas aidé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension d = tk.getBestCursorSize(32, 32);
            SelectCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
            RotateCursor = tk.createCustomCursor(RotateIc, new Point(16,16), "");
            ZoomCursor = tk.createCustomCursor(ZoomIc, new Point(16,16), "");
            SlideCursor = tk.createCustomCursor(SlideIc, new Point(16,16), "");


    à mois que j'ais tout compris à l'envers.
    merci

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Euh, appeler la méthode getBestCursorSize() sans se servir de l'info qu'elle donne ne sert évidemment à rien ...
    Dans le lien que j'ai donné, il est expliqué comment créer un curseur ayant la taille dont l'OS a besoin à partir de ton image (en créant une image de la bonne taille puis en copiant ton image dedans)

  5. #5
    Membre éclairé Avatar de ABN84
    Inscrit en
    Octobre 2007
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2007
    Messages : 410
    Par défaut
    appeler la méthode getBestCursorSize() sans se servir de l'info qu'elle donne ne sert évidemment à rien ...
    en effet!
    Dans le lien que j'ai donné, il est expliqué comment créer un curseur ayant la taille dont l'OS a besoin à partir de ton image (en créant une image de la bonne taille puis en copiant ton image dedans)
    j'ai pas vraiment trouvé, mais j'ai googlé et je suis tombé sur des codes utilisant de getBestCursorSize().
    voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Image RotateIc=(new javax.swing.ImageIcon(getClass().getResource("/image/rotate.PNG"))).getImage();
     
            Toolkit tk = Toolkit.getDefaultToolkit();
     
    	Dimension Rodim=tk.getBestCursorSize(18,18) ;
    	Image RotateCu = RotateIc.getScaledInstance(Rodim.width, Rodim.height, Image.SCALE_DEFAULT);
     
            RotateCursor = tk.createCustomCursor(RotateCu, new Point(18,18), "");
    j'ai donc, créé une image, determiné les meilleures dims, redimentionné l'image et en a créé un curseur. or ça donne tjrs la meme chose. ou est le prob?
    merci

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    L'idée est de ne pas redimensionner l'image :
    - tu utilises getBestCursorSize() pour savoir quelle taille aura ton curseur au final
    - tu crées une image vierge de cette taille
    - tu copies dans cette image vierge ta propre image sans la redimensionner (elle n'occupera qu'une partie de l'autre image)
    - au final tu obtiens une image de la bonne taille avec ta propre image dans sa taille initiale : visuellement un petit curseur, mais qui a quand même la taille demandée par l'OS

    Si tu essayes d'agrandir ton image initiale, tu auras forcément une image pas trop jolie, le redimensionnement d'une image avec peu de pixels ne pouvant donner de bons résultats. Si tu veux essayer d'avoir de meilleurs résultats, tu peux essayer avec Graphics.drawImage() qui peut donner de meilleurs résultats (cf. http://today.java.net/pub/a/today/20...dinstance.html )

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Par défaut
    J'ai eu le même problème et j'ai bataillé un moment avant de réussir à éviter l'aliasing super moche du curseur sous windows. En cherchant sur google, on trouve très peu de doc.

    Donc voici une implémentation possible qui se base sur la technique de NicoV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    /**
             * Create a cursor than can be used with any component from an icon.
             * The icon can be any kind of image that can be read with ImageIO (jpg, png, gif, bmp)
             * and is specified by its path.
             * @param imagePath Name of the image file to read
             * @param cursorName name of the cursor for later use
             * @return the Cursor that can be applied to a component.
             */
    	public static Cursor createCursorFromIcon(String imagePath, String cursorName) {
     
    		// Open the file specified by the path
    		File iconFile = new File(imagePath);
     
    		// create a buffered image from the file
    		BufferedImage icon = null;
    		try {
    			icon = ImageIO.read(iconFile);
    		} catch (IOException e) {
    			e.printStackTrace();
    			return null;
    		}
     
    		// The window system may not be able to use the specified image.
    		// Some window system are not able to display cursors with certain size.
    		// We then need to resize the image to the compatible dims.
    		Dimension compatibleDims = Toolkit.getDefaultToolkit().getBestCursorSize(icon.getWidth(), icon.getHeight());
     
    		// create a new image with a compatible dimentions
    		Image compatibleIcon = null;
    		if (compatibleDims.width == icon.getWidth() || compatibleDims.height == icon.getHeight()) {
    			// no need for resize just use the icon
    			compatibleIcon = icon;
    		} else if (icon.getWidth() < compatibleDims.width && icon.getHeight() < compatibleDims.height) {
    			// the icon is smaller than the compatible size
    			// We create a new image with a compatible size and copy the icon on the top left corner.
    			// The remaining part of the icon is kept transparent, so the cursor rendering
    			// is actually unchanged
    			BufferedImage compatibleIconB = new BufferedImage(compatibleDims.width, compatibleDims.height, BufferedImage.TYPE_INT_ARGB);
     
    			// by default set the image to transparent
    			for (int i = 0; i < compatibleIconB.getWidth(); i++) {
    				for (int j = 0; j < compatibleIconB.getHeight(); j++) {
    					compatibleIconB.setRGB(i, j, 0);
    				}
    			}
     
    			// then copy the icon in the top left part
    			for (int i = 0; i < icon.getWidth(); i++) {
    				for (int j = 0; j < icon.getHeight(); j++) {
    					// we're lucky since getRGB return the value as ARGB
    					compatibleIconB.setRGB(i, j, icon.getRGB(i, j));
    				}
    			}
     
    			compatibleIcon = compatibleIconB;
    		} else {
    			// the icon is larger than the compatible size
    			// we then need to reduce it
    			compatibleIcon = icon.getScaledInstance(compatibleDims.width, compatibleDims.height, Image.SCALE_SMOOTH);
    		}
     
    		// finally create the Cursor
    		// the second parameter is quite obscure, the java doc does not help very much. But using
    		// (0, 0) as value works fine so let's use this.
    		return Toolkit.getDefaultToolkit().createCustomCursor(compatibleIcon, new Point(0, 0), cursorName);
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. graphique comment changer le nom par defaut de la serie
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/12/2007, 19h01
  2. Réponses: 7
    Dernier message: 11/05/2006, 14h46
  3. Comment démarrer WIN XP par défaut et non Redhat ?
    Par callo dans le forum Administration système
    Réponses: 3
    Dernier message: 20/10/2004, 18h00
  4. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 22h11
  5. Changer le thème par défaut
    Par Chance666 dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 26/09/2003, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo