Neste artigo iremos explorar alguns dos recursos das classes SystemTray e TrayIcon do Java 6 para com isso criarmos uma System Tray multiplataforma, para usarmos em nossas aplicações desktop, as classes SystemTray e TrayIcon fazem parte do pacote java.awt e juntas possibilitam a criação de um Tray com recursos tais como : imagens, popups,menus,submenus e itens de notificações.
No código descrito nesse artigo nós abordamos a maioria dos recursos dessas classes, para não ficar muito extenso, o código esta todo comentado.
A Figura 01 apresenta a aparência de nosso Tray.

Figura 01. Tray em execução.
//Importando as bibliotecas necessárias
import java.awt.AWTException;
import java.awt.CheckboxMenuItem;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
public class Main {
public static void main(String[] args) {
final TrayIcon trayIcon; // declarando uma constante do tipo TrayIcon
// Aqui vamos testar se o recurso é suportado
if (SystemTray.isSupported()) {
//declarando uma variavel do tipo SystemTray
SystemTray tray = SystemTray.getSystemTray();
//declarando uma variavel do tipo Image que contera a imagem tray.gif
Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");
//Criamos um listener para escutar os eventos de mouse
MouseListener mouseListener = new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
//Toda vez que for clicado imprime uma mensagem na tela
System.out.println("Tray Icon - O Mouse foi pressionado!");
}
public void mouseReleased(MouseEvent e) {
}
};
// Criamos um ActionListener para a ação de encerramento do programa.
ActionListener exitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Imprime uma mensagem de despedida na tela
System.out.println("Saindo...");
JOptionPane.showMessageDialog(null,"Saindo...");
System.exit(0);
}
};
// Criamos um ActionListener para a exibir uma mensagem na tela ao clicarmos
//em um item do menu.
ActionListener mostramsglistener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null,"Java 6 é uma revolução.");
}
};
//Criando um objeto PopupMenu
PopupMenu popup = new PopupMenu("Menu de Opções");
//criando itens do menu
MenuItem mostramsg = new MenuItem("Exibir Mensagem");
MenuItem defaultItem = new MenuItem("Sair");
//na linha a seguir associamos os objetos aos eventos
mostramsg.addActionListener(mostramsglistener);
defaultItem.addActionListener(exitListener);
//Adicionando itens ao PopupMenu
popup.add(mostramsg);
//adiconando um separador
popup.addSeparator();
//Criando objetos do tipo Checkbox
CheckboxMenuItem cheque1 = new CheckboxMenuItem("Ativar Plugins");
popup.add(cheque1);
CheckboxMenuItem cheque2 = new CheckboxMenuItem("Iniciar Minimizado");
popup.add(cheque2);
popup.addSeparator();
//Criando um submenu
PopupMenu popup2 = new PopupMenu("SubMenu de Opções");
MenuItem mostramsg2 = new MenuItem("Item1");
MenuItem mostramsg3 = new MenuItem("Item2");
MenuItem mostramsg4 = new MenuItem("Item3");
popup2.add(mostramsg2);
popup2.add(mostramsg3);
popup2.add(mostramsg4);
popup.add(popup2);
popup.addSeparator();
popup.add(defaultItem);
//criando um objeto do tipo TrayIcon
trayIcon = new TrayIcon(image, "TrayIcon Demonstração", popup);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
trayIcon.displayMessage("Action Event",
"Um Evento foi disparado",
TrayIcon.MessageType.INFO);
}
};
//Na linha a seguir a imagem a ser utilizada como icone sera redimensionada
trayIcon.setImageAutoSize(true);
//Seguida adicionamos os actions listeners
trayIcon.addActionListener(actionListener);
trayIcon.addMouseListener(mouseListener);
//Tratamento de erros
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println("Erro, TrayIcon não sera adicionado.");
}
} else {
//Caso o item System Tray não for suportado
JOptionPane.showMessageDialog(null,"recurso ainda não esta disponível pra o seu sistema");
}
}
}// Fim do código.
Em nosso exemplo não usei nenhuma IDE, por isso vamos compilar tudo no modo texto, mas nada impede que o leitor use sua IDE preferida.
É importante lembrar que será necessário ter uma imagem chamada tray.gif no diretório corrente para que o ícone de nosso tray seja mostrado.
A Figura2 demonstra o processo de compilação e execução do Tray.

Figura 02. Compilando e Executando o Tray.
Na Figura 03 mostramos o no nosso Tray rodando na area de Notificação do KDE.

Figura 03.
Ao colocarmos o mouse sobre o ícone é mostrada uma dica sobre o aplicativo (Figura 04).

Figura 04.
Se for dado um duplo clique no ícone da aplicação será exibido uma tela de notificação (Figura 05).

Figura 05.
Ao clicarmos com o botão direito do mouse é aberto o Menu popup (Figura 6). As opções mostradas são apenas ilustrativas, apenas existem ações associados ao item mensagem e sair. O item Sair executa uma ação de sair e mostra uma tela de despedida do aplicativo. O Item mensagem mostra outra mensagem, falta criar ações para os outros itens, isso fica por conta da criatividade de vocês.

Figura 06.
Na Figura 7 Vemos a Execução do Tray na plataforma Windows (Figura7) e com isso fechamos esse artigo. Até aproxima!

Figura 07. Tray sendo executado na plataforma windows.