Recherche :

Icône dans la barre de système avec Java 6
Langages

Parmi les nouveautés de Java 6, une meilleure intégration avec le système d'exploitation utilisé comme par exemple l'affichage par les programmes Java d'une icône dans la barre de système (System Tray).

 

L'affichage de tel icône demandait avant Java 6 l'utilisation d'outils externes pour n'est pas sacrifier la portabilité de Java sur diverses plateformes (Java est un langage multiplateformes). Par exemple JDIC (JDesktop Integration Components)

 

Il est maintenant possible d'ajouter un composant TrayIcon (une icône) avec des menus et des messages dans la barre de tâches de Windows, ou dans la zone de notification de Gnome ou la barre système de KDE etc.

 

A partir de maintenant on utilise la barre de système.

 

L'intégration Java6/système offre d'autres possibilités, via la classe Desktop par exemple. Nous limitons ce tutoriel au domaine SystemTray/TrayIcon

 

La version de NetBeans utilisée dans ce tutoriel est 6.5 Beta

 

La version d'Eclipse utilisée est 3.4

Le système utilisé pour les test Gnu/Linux (Fedora 9) sous Gnome

1. Classes :

Pour utiliser la barre de système deux classes uniquement sont nécessaires :

 

  1. SystemTray

  2. TrayIcon

 

SystemTray présente une instance de la barre de système de la plateforme utilisée.

 

TrayIcon est un composant affiché dans la barre de système

 

 


Note:

La méthode getSystemTray() permet d'obtenir une instance de SystemTray.

 

Important !!!

 

Avant d'appeler getSystemTray() il est préférable de s'assurer que la plateforme ou le OS utilisé supporte les fonctionnalités de la barre de système comme suite :

 

if (SystemTray.isSupported()) {    SystemTray tray = SystemTray.getSystemTray();  }

Note :

 

Il est possible pour une application d'afficher plusieurs icônes dans la barre de système

2. Créer une application pour le test

Pour tester les codes d'une façon graphique (en cliquant par exemple sur un bouton), nous allons construire en quelques clics une application graphique dans NetBeans 6.5. Ceci n'est nullement nécessaire, voir plus loin.

 

Après le lancement de NetBeans 6.5 -> Sélectionner " New Project " dans le menu " File ".

 

Dans " Choose project " -> Sélectionner " Java " et " Java Desktop Application " -> un clic sur suite

 

Dans " Name and location " -> Entrer le nom de l'application et Sélectionner " Basic Application " -> un clic sur " Finish " pour terminer

 

3. Ajouter un bouton

Un clic sur le composant " Button " dans la palette puis sur l'espace de travail.

 

Pour modifier le texte du bouton -> Clic droit sur le bouton -> Edit Text

 

Pour ajouter un événement " ActionEvent " -> un clic droit sur le bouton -> Event -> Action -> actionPerformed

 

L'éditeur ajoute l'événement et ouvre le code source

4. TrayIcon

Est le composant à ajouter dans la barre de système. Il est possible d'ajouter un ou plusieurs composants dans la barre de système. Chaque composant contient un menu, une bulle d'aide et une image.

 

Note :

N'importe quelle image fera l'affaire. Le format de l'image doit être supporté

 

Note :

 

Il est même possible d'afficher une image animée (.gif)

 

Commençons par ajouter un composant TrayIcon dans la barre de système

 

Entrons le code suivant (par exemple dans l'éditeur de NetBeans dans actionPerformed comme mentionné précédemment. Le clic sur le bouton met une icône dans la barre de système) :

 

Runnable runner = new Runnable() {

public void run() {

if (SystemTray.isSupported()) {

SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage("cross.gif");

PopupMenu popup = new PopupMenu();

MenuItem item = new MenuItem("Menu dans la barre de système");

popup.add(item);

//image, message dans une bulle d'aide, et menu pop-up

TrayIcon trayIcon = new TrayIcon(image, "SystemTrayIcon", popup);

try {

tray.add(trayIcon);

} catch (AWTException e) {

System.err.println("Exception est lancée");

}

} else {

System.err.println("Fontion non supportée");

}

}

};

EventQueue.invokeLater(runner);

5. Trois constructeurs sont disponibles :

TrayIcon(Image image)

//l'image à afficher

TrayIcon(Image image, String tooltip)

//image et bulle d'aide

TrayIcon(Image image, String tooltip, PopupMenu popup)

//image, bulle d'aide et menu pop-up

6. Evénements par défaut

TrayIcon reçoit par défaut deux événements

  1. Un clic droit sur l'icône permet d'afficher les menus
  2.  Un hover ou passage de la souris permet d'afficher une bulle d'aide (deuxième argument)

 

 

7. Application graphique, IDE et ligne de commande

Il est à noter qu'afficher des composants dans la barre de système n'a nullement besoin de construire une application graphique comme Jframe par exemple. Les deux classes SystemTray et TrayIcon sont dans le parquetage (package) java.awt

 

Entrons le même code que précédemment et sans modification dans une petite application stand-alone Java

 

import java.awt.*;

public class TestSystemTrayIcon

{

public static void main(String[] args)

{

Runnable runner = new Runnable() {

public void run() {

if (SystemTray.isSupported()) {

SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage("cross2.gif");

PopupMenu popup = new PopupMenu();

MenuItem item = new MenuItem("Menu dans la barre de système");

popup.add(item);

TrayIcon trayIcon = new TrayIcon(image, "SystemTrayIcon", popup);

try {

tray.add(trayIcon);

} catch (AWTException e) {

System.err.println("Exception est lancée");

}

} else {

System.err.println("Fontion non supportée");

}

}

};

EventQueue.invokeLater(runner);

}

}

8. Compiler et exécuter

Le résultat est identique Clin d'oeil

9. Où placer l'image pour l'icône

-Pour un fichier source .java compilé et exécuté de la ligne de commande l'image doit être avec les fichiers sources dans le même dossier.

 

-A l'intérieur d'une IDE il faut rendre l'image disponible à l'intérieur des packages, on peut la mettre par exemple dans la racine du projet en-cours dans Netbeans (6.5) et Eclipse (3.4)

 

-Si la classe est appelée à partir d'un fichier .jar (différent d'un fichier .jar exécutable) :

1-L'image est à placée dans le même dossier que les fichiers sources

2-On remplace l'expression

Image image = Toolkit.getDefaultToolkit().getImage("cross2.gif");

par:

 

Toolkit kit = Toolkit.getDefaultToolkit();

java.net.URL imgURL = TestSystemTrayIcon.class.getResource("cross2.gif");

Image image = kit.getImage(imgURL);


Note :

 

Il est à noter que les deux dernières expressions marchent aussi bien aussi dans l'IDE et pour un fichier isolé .java en mettant l'image dans le même dossier que les fichiers sources

 

Note :

 

Pour construire un fichier archive .jar dans Eclipse. Sélectionner le projet -> clic droit -> Export -> General -> Archive File. Cocher " create only selected directories ", Un clic sur " Browse " pour sélectionner le dossier de destination. Cocher uniquement à partir des packages contenant les binaires. Un clic sur " Finish " pour terminer 

 

Note :

Pour appeler la classe dans le fichier .jar

Changer de dossier pour aller dans le dossier contenant le fichier .jar

 

Puis:

 

java -cp /home/kas/test/test.jar fr/iipt/ka/TestSystemTray

 

/home/kas/test/test.jar est la CLASSPATH vers le fichier .jar

fr/iipt/ka est le package contenant la classe " TestSystemTray "

 

-Pour les .jar exécutables on procède de la même manière et l'IDE se charge de placer l'image dans le dossier " build " comme par exemple pour NetBeans 6.5 Beta ou en utilisant des outils et plug-ins avec Eclipse comme " FatJar "

 


10. Ajouter des actions

Remplaçons le code précédent pour ajouter une action au menu, comme par exemple quitter l'application en cliquant sur ce menu (click droit sur l’icône dans la barre de système--> un clic sur le menu " Quitter " permet de quitter l'application

 

 

Note :

Un changement du texte affiché dans le menu est aussi effectué dans le code

 

 

MenuItem item = new MenuItem("Quitter");

item.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

System.exit(0);

}});

11. Enlever l'icône de la barre système

Modifier le code pour ajouter un deuxième menu pour uniquement quitter la barre système

 

 

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

Runnable runner = new Runnable() {

public void run() {

if (SystemTray.isSupported()) {

final SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage("cross2.gif");

PopupMenu popup = new PopupMenu();



MenuItem quitterApplication = new MenuItem("Quitter l'Application");

quitterApplication.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

System.exit(0);

}});

popup.add(quitterApplication);


final TrayIcon trayIcon = new TrayIcon(image, "SystemTrayIcon", popup);


//ici quitter uniquement la barre de système

MenuItem quitterBarre = new MenuItem("Quitter la Barre");

quitterBarre.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

tray.remove(trayIcon);


}});

popup.add(quitterBarre);


try {

tray.add(trayIcon);

} catch (AWTException e) {

System.err.println("Exception est lancée");

}

} else {

System.err.println("Fontion non supportée");

}

}

};

EventQueue.invokeLater(runner);




}

 

 

Note :

 

Attention à l'instruction " final " car les variables sont utilisées dans une classe interne locale

 

Note :

Un clic droit sur l'icône permet de voir maintenant deux menus, pour quitter l'application et pour quitter uniquement la barre de système

 

Un clic sur quitter la barre permet d'enlever l'icône de la barre de système en laissant l'application

12. Afficher des messages

La méthode " displayMessage() " de TrayIcon permet d'afficher un message quand on sélectionne un menu. Le message est affiché dans un cadre sous forme de pop-up avec une icône selon la nature du message

La méthode displayMessage a la forme suivante :

displayMessage(String titre_de_popup, String message, TrayIcon.MessageType)


Note:

Les types pour les messages sont définis dans

Enum TrayIcon.MessageType


Note :

Les types valables de messages sont :

INFO

ERROR

WARNING

NONE

 

Tableau TrayIcon.MessageType Enumerations

TrayIcon.MessageType.ERROR             Message d'erreur

TrayIcon.MessageType.INFO              Message d'information

TrayIcon.MessageType.NONE              Message simple

TrayIcon.MessageType.WARNING           Message d'avertissement


Note :

Exemple message d'info

TrayIcon.MessageType.INFO

Note :

Dans l'image un message d'erreur est affiché


13. Le code avec trois menus

Runnable runner = new Runnable() {

public void run() {

if (SystemTray.isSupported()) {

final SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage("cross2.gif");

PopupMenu popup = new PopupMenu();


final TrayIcon trayIcon = new TrayIcon(image, "SystemTrayIcon", popup);


//afficher un message

MenuItem afficherMessage = new MenuItem("Afficher un message");

afficherMessage.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

trayIcon.displayMessage("method displayMessage", "Afficher un message", TrayIcon.MessageType.ERROR);

}});

popup.add(afficherMessage);



MenuItem quitterApplication = new MenuItem("Quitter l'Application");

quitterApplication.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

System.exit(0);

}});

popup.add(quitterApplication);



//ici quitter uniquement la barre de système

MenuItem quitterBarre = new MenuItem("Quitter la Barre");

quitterBarre.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

tray.remove(trayIcon);


}});

popup.add(quitterBarre);






try {

tray.add(trayIcon);

} catch (AWTException e) {

System.err.println("Exception est lancée");

}

} else {

System.err.println("Fontion non supportée");

}

}

};

EventQueue.invokeLater(runner);

 


14. Redimensionner automatiquement l'image

Il est possible de demander un redimensionnement

 

Automatique de l'image en appelant une méthode de la classe TrayIcon :

 

public void setImageAutoSize(boolean autosize)

 

Note :

 

Par défaut le redimensionnement

Est désactivé par " false "

 

15. Autres événements :

TrayIcon lance plusieurs événements qu'il est possible de capter. Deux événement sont captés et traités par défaut :

 

-Click droit : Affiche les menus

-Hover ou passage de la souris : Affiche la bulle d'aide

 

 

D'autres événements sont produits par TrayIcon comme par exemple

Les évènements de la souris, ActionEvent, quand l'utilisateur clic avec le bouton gauche de la souris etc.

 

Exemple utiliser quelques événements de la souris :

 

MouseListener ml;

ml = new MouseListener ()

{

public void mouseClicked (MouseEvent e)

{

System.out.println ("Tray icon: Soruis cliquée");

}


public void mouseEntered (MouseEvent e)

{

System.out.println ("Tray icon: Souris entrée");

}


public void mouseExited (MouseEvent e)

{

System.out.println ("Tray icon: Souris quitée");

}


public void mousePressed (MouseEvent e)

{

System.out.println ("Tray icon: Souris bouton gauche");

}


public void mouseReleased (MouseEvent e)

{

System.out.println ("Tray icon: Souris bouton gauche lâché");

}

};




trayIcon.addMouseListener(ml);

 


Note :

ActionEvent est un événement dépendant de la plateforme et ne marche malheureusement pas sur ma version de Gnome 2.22.2

16. Modifier l'image

La méthode setImage(image) de la classe TrayIcon permet de modifier l'image affichée dans l'icône.


La méthode trayIcon.setToolTip(String s), modifie la bulle d'aide


Exemple :

Modifier l'image et la bulle d'aide suite à un clic sur le bouton gauche de la souris


public void mouseClicked (MouseEvent e)

{

System.out.println ("Tray icon: Soruis cliquée");

Toolkit kit = Toolkit.getDefaultToolkit();

java.net.URL imgURL = SystemTrayIconView.class.getResource("new.gif");

Image image = kit.getImage(imgURL);

trayIcon.setImage(image);

trayIcon.setToolTip("Bulle d'aide modifiée");

}


17. Conclusion :

Les possibilités offertes par cette nouveauté de Java 6 sont sans fin. On peut utiliser beaucoup d'autres méthodes avec les deux classes


18. Site Web

http://java.sun.com/

19. C'est fini

Merci Sourire

Programmez! n° 133
Le numéro 133 de Programmez! est disponible en kiosque.





Proposer un tutoriel
Vous souhaitez partagez vos connaissances avec les membres de Programmez! Publiez vos tutoriels.

L'auteur
ka (Kaesar ALNIJRES)

Développeur Java - Manager Web



http://www.iipt.fr

De A à Z
Programmez.com - 2010 - Tous droits réservés
Développement - WEB - ASP - PHP - C++ - Delphi - Java - Magazines - Ressources - Forum - Télécharger - Video - Emploi - Campus - .Net - Tutoriels

Le portail du décideur informatique en entreprise : Solutions & Logiciels