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
Pour utiliser la barre de système deux classes uniquement sont nécessaires :
SystemTray
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
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
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
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);
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
TrayIcon reçoit par défaut deux événements
Un clic droit sur l'icône permet d'afficher les menusUn hover ou passage de la souris permet d'afficher une bulle d'aide (deuxième argument)
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);
}
}
Le résultat est identique 
-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
Où
/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 "
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);
}});
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
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é
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);
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 "
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
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");
}
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
http://java.sun.com/
Merci 