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

SWT/JFace Java Discussion :

[SWT/JFace] Récupérer les icônes du système


Sujet :

SWT/JFace Java

  1. #1
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut [SWT/JFace] Récupérer les icônes du système
    Bonjour !

    Est-ce que quelqu'un sait si c'est possible récupérer les icônes du système ?

    Car je fais une sorte d'explorateur de fichiers pour un application, et je me suis dit que les utilisateurs basiques serait plus rassurés s'ils voyaient les mêmes icônes que d'habitude pultôt que des icônes choisies par moi...
    Wookai


  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Le reponse dois etre oui par contre pour la portabilité... Ca va etre dur. Java utilisant ses propres composants ne se base pas sur le systeme et donc est portable (theoriquement).

  3. #3
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    regarde du coté de FileSystemView qui sait faire ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FileSystemView.getFileSystemView().getSystemIcon(File f)
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  4. #4
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par TabrisLeFol
    Le reponse dois etre oui par contre pour la portabilité... Ca va etre dur. Java utilisant ses propres composants ne se base pas sur le systeme et donc est portable (theoriquement).
    Je suis d'accord, mais pour l'instant l'application est destinée essentiellement à Windows. Peut-être les prochaines versions seront-elles mulit-OS, mais pas pour l'instant !

    Merci divxdede, je vais voir !!

    EDIT: nickel, mais le probème maintenant c'est que je veux un objet Image, et là c'est un Icon... Un moyen de convertir ?
    Wookai


  5. #5
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par Wookai
    Citation Envoyé par TabrisLeFol
    Le reponse dois etre oui par contre pour la portabilité... Ca va etre dur. Java utilisant ses propres composants ne se base pas sur le systeme et donc est portable (theoriquement).
    Je suis d'accord, mais pour l'instant l'application est destinée essentiellement à Windows. Peut-être les prochaines versions seront-elles mulit-OS, mais pas pour l'instant !

    Merci divxdede, je vais voir !!

    EDIT: nickel, mais le probème maintenant c'est que je veux un objet Image, et là c'est un Icon... Un moyen de convertir ?
    Essai ce genre de code (non completement testé, je viens de l'écrire)
    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
     
    /** Transforme un Icon en Image
         *  Si l'icon est une instance de ImageIcon alors l'image gérée par l'icone est retournée
         *  Dans le cas contraire, on retourne une BufferedImage dans laquelle on a dessiner l'icone d'origine
         *  @param icon Icone à transformer en image
         *  @return Image representant l'icone
         */
        public Image iconToImage(Icon icon)    
        {  
           if( icon instanceof ImageIcon ) return ((ImageIcon)icon).getImage();
     
           /** On dessine l'icone dans un bufferedImage **/
           BufferedImage image = new BufferedImage( icon.getIconWidth() , icon.getIconHeight() , BufferedImage.TYPE_INT_RGB );
           icon.paintIcon(null, image.getGraphics() , 0 , 0 );
           return image;
        }
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  6. #6
    Membre habitué Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Points : 180
    Points
    180
    Par défaut
    Bon, pour ceux que ça intéresse, j'ai trouvé la solution grâce à Google :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String extension = myFile.getName().substring(file.getName().lastIndexOf("."));
    Program launcher = Program.findProgram(extension);
    ImageData imgData = launcher.getImageData();
    Image img = new Image(null, imgData);
    Cette classe Program m'a l'air bien utile ! Merci pour vos réponses !
    Wookai


  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Hello,
    La solution d'avant ne me convenait pas (on a pas toutes les icones des fichiers), j'ai trouvé la solution ultime:
    conversion awt Icon => swt Image !!!
    Trouvé ici: http://www.koders.com/java/fidA704E1...9E0062C97.aspx
    (merci les boches!)

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    	Image getSystemImageFromFile(File fFile)
            {
    	   ImageData imgData = getImageData(fFile);
    	   if (imgData != null){
    		return new Image(Display.getCurrent(), imgData);
    	   }
    	    return null;
    	}
    		public ImageData getImageData(File file) {
    			Icon icon = FileSystemView.getFileSystemView().getSystemIcon(file);
    			BufferedImage image = new BufferedImage(icon.getIconWidth(), icon
    					.getIconHeight(), BufferedImage.TYPE_INT_ARGB);//TYPE_BYTE_INDEXED);
    			icon.paintIcon(null, image.getGraphics(), 0, 0);
    			return convertToSWT(image);
    		}
     
    		private ImageData convertToSWT(BufferedImage bufferedImage)
    		{
    			if (bufferedImage.getColorModel() instanceof DirectColorModel)
    			{
    				DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();
    				PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel
    						.getGreenMask(), colorModel.getBlueMask());
    				ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(),
    						colorModel.getPixelSize(), palette);
    				WritableRaster raster = bufferedImage.getRaster();
    				int[] pixelArray = new int[4];
    				for (int y = 0; y < data.height; y++)
    				{
    					for (int x = 0; x < data.width; x++)
    					{
    						raster.getPixel(x, y, pixelArray);
    						int pixel;
    						if (pixelArray[3] < 100)
    						{
    							// if the transparancy is low - set it to white.
    							pixel = palette.getPixel(new RGB(255, 255, 255));
    						}
    						else
    						{
    							pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1],
    									pixelArray[2]));
    						}
     
    						data.setPixel(x, y, pixel);
     
    					}
    				}
    				return data;
    			}
    			else if (bufferedImage.getColorModel() instanceof IndexColorModel)
    			{
    				IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel();
    				int size = colorModel.getMapSize();
    				byte[] reds = new byte[size];
    				byte[] greens = new byte[size];
    				byte[] blues = new byte[size];
    				colorModel.getReds(reds);
    				colorModel.getGreens(greens);
    				colorModel.getBlues(blues);
    				RGB[] rgbs = new RGB[size];
    				for (int i = 0; i < rgbs.length; i++)
    				{
    					rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF);
    				}
    				PaletteData palette = new PaletteData(rgbs);
    				ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(),
    						colorModel.getPixelSize(), palette);
    				data.transparentPixel = colorModel.getTransparentPixel();
    				WritableRaster raster = bufferedImage.getRaster();
    				int[] pixelArray = new int[1];
    				for (int y = 0; y < data.height; y++)
    				{
    					for (int x = 0; x < data.width; x++)
    					{
    						raster.getPixel(x, y, pixelArray);
    						data.setPixel(x, y, pixelArray[0]);
    					}
    				}
    				return data;
    			}
    			return null;
    		}
    Ca marche avec tous les fichiers, les dossiers et les disques durs!
    On peut enfin créer un explorer custom avec SWT-JFace!
    Enjoy

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonjour,
    Merci pour ce bout de code très utile.
    J'ai quelque peu modifié la méthode convertToSWT pour prendre en compte alpha de chaque pixel quand il s'agit d'une instance de DirectColorModel, l'image que l'on retrouve à la sortie est plus belle.
    Je le poste ça pourra servir à quelqu'un :
    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
     
    if (bufferedImage.getColorModel() instanceof DirectColorModel) {
          DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel();
          PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(),
              colorModel.getBlueMask());
          ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), colorModel.getPixelSize(),
              palette);
          WritableRaster raster = bufferedImage.getRaster();
          int[] pixelArray = new int[4];
          for (int y = 0; y < data.height; y++) {
            for (int x = 0; x < data.width; x++) {
              raster.getPixel(x, y, pixelArray);
              int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));
     
              data.setPixel(x, y, pixel);
              data.setAlpha(x, y, pixelArray[3]);
     
            }
          }
          return data;
        }

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

Discussions similaires

  1. [Rcp/Swt/Jface] "Disposer les colonnes d'un tableViewer"
    Par papaetoo dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 05/08/2009, 18h00
  2. Récupérer les icônes système
    Par Marcolinho dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 01/09/2008, 14h01
  3. Récupérer les stats du système
    Par 00Dexter00 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2007, 20h55
  4. Récupérer les polices du système
    Par cedekasme dans le forum MFC
    Réponses: 3
    Dernier message: 21/06/2006, 16h14
  5. Récupérer les icônes système
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 05/12/2005, 17h29

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