Publié le 14/01/2014
Auteur Axel
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Utiliser les icones du Look and Feel

Les applications contiennent de nombreuses icones pour guider l'utilisateur et aussi pour égayer les interfaces des fenêtres. Il y a quelques temps, nous avons vu dans l'article Extraire les icones systeme de l'OS, comment réutiliser les images associées à une extension de fichier.
D'autres icônes sont utilisées par le système d'exploitation à l'ouverture d'une boite de dialogue et dans l'explorateur de fichier. Voyons comment utiliser les icônes système dans les applications JAVA.

Définir l'apparence avec un LookAndFeel

Au travers des LookAndFeel, l'apparence des applications Java peut être modifiée, cette transformation englobe les icônes utilisées dans les boites de dialogue. Ci-dessous les différences entre le Look And Feel Windows et Metal sont facilement reconnaissables.
1038_windows1038_metal

Comment extraire les icones du LookAndFeel

L'ensemble des propriétés d'un LookAndFeel sont définit dans le UIManager, dans notre cas, seules les icônes nous intéressent.
La class SystemIcons comprend un mécanisme de redimensionnement d'image. En effet, les icones du LookAndFeel ont une taille fixe, la fonction get(String iconeName, int width, int height) retourne une image pouvant être directement utilisée dans un JLabel par exemple.
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
 
/**
 * Utiliser les icones du Look And Feel
 *
 * @author Axel 01/2013
 * @see http://www.fobec.com/java/1138/utiliser-icones-look-and-feel.html
 */
public class SystemIcons {
 
    //Boite de dialogue
    public final static String DIALOG_ERROR = "OptionPane.errorIcon";
    public final static String DIALOG_INFO = "OptionPane.informationIcon";
    public final static String DIALOG_QUESTION = "OptionPane.questionIcon";
    public final static String DIALOG_WARNING = "OptionPane.warningIcon";
 
    //Fichier
    public final static String FILE_COMPUTER = "FileView.computerIcon";
    public final static String FILE_DIRECTORY = "FileView.directoryIcon";
    public final static String FILE_FILE = "FileView.fileIcon";
    public final static String FILE_FLOPPY = "FileView.floppyDriveIcon";
    public final static String FILE_DRIVE = "FileView.hardDriveIcon";
 
    //Dialogue enregistrer sous ou Ouvrir
    public final static String CHOOSER_HOME = "FileChooser.homeFolderIcon";
    public final static String CHOOSER_NEWDIR = "FileChooser.newFolderIcon";
    public final static String CHOOSER_DIRUP = "FileChooser.upFolderIcon";
    public final static String CHOOSER_DETAIL = "FileChooser.detailsViewIcon";
    public final static String CHOOSER_LIST = "FileChooser.listViewIcon";
 
    //Treeview system
    public final static String TREE_CLOSED = "Tree.closedIcon";
    public final static String TREE_OPENED = "Tree.openIcon";
    public final static String TREE_COLLAPSED = "Tree.collapsedIcon";
 
    /**
     * Retourner l'icone
     *
     * @param iconeName
     * @return Icon ou null
     */
    public Icon get(String iconeName) {
        return UIManager.getIcon(iconeName);
    }
 
    /**
     * Retourner l'icone redimensionnée
     *
     * @param iconeName
     * @param width
     * @param height
     * @return Icon ou null
     */
    public Icon get(String iconeName, int width, int height) {
        Icon sysIco = UIManager.getIcon(iconeName);
 
        //Dessiner l'icon sur un BufferedImage
        BufferedImage image = new BufferedImage(sysIco.getIconWidth(), sysIco.getIconHeight(),
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        sysIco.paintIcon(null, g, 0, 0);
        g.dispose();
 
        //Redimensionner l'image
        BufferedImage resized = new BufferedImage(width, height, image.getType());
        g = resized.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(image, 0, 0, width, height, 0, 0, sysIco.getIconWidth(),
                sysIco.getIconHeight(), null);
        g.dispose();
 
        //Créer une icone à partir de l'image
        ImageIcon imageIcon = new ImageIcon(resized);
        return imageIcon;
    }
 
    /**
     * Exemple d'une fenetre affichant toutes les icones à partir des constantes
     *
     * @param args
     */
    public static void main(String[] args) {
        //Liste des constantes
        String[] TEXTS = {"DIALOG_ERROR", "DIALOG_INFO", "DIALOG_QUESTION", "DIALOG_WARNING",
            "FILE_COMPUTER", "FILE_DIRECTORY", "FILE_FILE", "FILE_FLOPPY", "FILE_DRIVE",
            "CHOOSER_HOME", "CHOOSER_NEWDIR", "CHOOSER_DIRUP", "CHOOSER_DETAIL", "CHOOSER_LIST",
            "TREE_CLOSED", "TREE_OPENED", "TREE_COLLAPSED"};
        String[] CONSTS = {DIALOG_ERROR, DIALOG_INFO, DIALOG_QUESTION, DIALOG_WARNING,
            FILE_COMPUTER, FILE_DIRECTORY, FILE_FILE, FILE_FLOPPY, FILE_DRIVE,
            CHOOSER_HOME, CHOOSER_NEWDIR, CHOOSER_DIRUP, CHOOSER_DETAIL, CHOOSER_LIST,
            TREE_CLOSED, TREE_OPENED, TREE_COLLAPSED};
 
        SystemIcons systemIcons = new SystemIcons();
 
        //Création de la fenetre
        JFrame jFrame = new JFrame();
        jFrame.setTitle("LookAndFeel " + UIManager.getLookAndFeel().getName());
        jFrame.setSize(600, 550);
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.getContentPane().setBackground(Color.WHITE);
 
        int y = 10;
        JLabel lb;
        String lbTitle;
        Icon icon;
 
        //Creer des label à partir des icones
        for (int i = 0; i < TEXTS.length; i++) {
            icon = systemIcons.get(CONSTS[i]);
            if (icon == null) {
                lbTitle = TEXTS[i] + " non disponible ";
                lb = new JLabel(lbTitle, null, SwingConstants.LEFT);
                jFrame.getContentPane().add(lb);
                lb.setBounds(10, y, 300, 24);
                y += 24 + 10;
            } else {
                lbTitle = TEXTS[i] + " taille: " + icon.getIconWidth() + " x "
                        + icon.getIconHeight();
                lb = new JLabel(lbTitle, icon, SwingConstants.LEFT);
                jFrame.getContentPane().add(lb);
                lb.setBounds(10, y, 300, icon.getIconHeight());
                y += icon.getIconHeight() + 10;
            }
        }
        jFrame.setVisible(true);
    }
}
La fonction public static void main(String[] args) liste l'ensemble des icônes en indiquant la taille de chaque image, elle a été utilisée pour générer les 2 copies d'écran.

Ajouter une icone à un JLabel

Comment ajouter l'icone warning de taille 24 x 24 à un JLabel ?
SystemIcons systemIcons = new SystemIcons();
Icon ico = systemIcons.get(SystemIcons.DIALOG_WARNING, 24, 24);
lbwarning.setIcon(ico);

L'ajout d'icone à partir d'un LookAndFeel présente l'avantage qu'il n'y a aucune image à joindre au jar, notre application pioche directement dans les icônes du système d'exploitation.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - sources
Mise a jour
14/01/2014
Visualisation
vu 3203 fois
Public
Internaute
Auteur de la publication
Axel
Membre junior
Auteur de 51 articles
|BIO_PSEUDO|
Commentaires récents

Publié par iliass dans CMS

aebgksdktu hsmu yailsh iliass jqd ou azmwt wa ikraame

Publié par pidjey dans php5

J'ai bien lu mais c'est vraiment trop fort et trop dur pour le moment, je sais pas vraiment comprendre vos syntaxes, elles sont enormes et moi, je ne suis qu'encore un debutant en PHP et il faudrait p...

Publié par Fobec dans news

Bonjour,
la localisation des adresses ip utilise plusieurs algo de recherche de position geographique. La precision du rapport d'analyse correspond la qualite de la localisation:
9/10 la locali...

Publié par Kachwahed dans CMS

Merci, ca marche avec moi, mais apès avoir changer:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HRes, VRes]);
par:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HorizRes, VertRes]); <...

Publié par roundge dans php5

Bien ! Merci pour cette petite classe en php bien pratique !
J'avais 2000 photos libres de droits à télécharger sur un site, dans un dossier ou les fichiers ne sont pas list&e...