SyntaxHighlighter

terça-feira, 26 de outubro de 2010

Java no System Tray do Sistema operacional

Confesso que a semana começou agitada ... projeto pra entregar, cronograma que não fecha e uma Terça-Feira com rendimento lá embaixo, fruto daquele problema que você corre atrás pra resolver mas não sabe ao certo se a cagada é sua. Não há santo que coloque esse humor em uma escala que não ofereça risco ao próximo :-). Pra aliviar a tensão e aguentar o resto da semana (falta muito?) corrida e java milk.


Neste post vou falar um pouco sobre o System Tray do sistema operacional e como fazer pra que seu aplicativo java vá parar lá.

O System Tray é um espaço reservado em algumas plataformas (windows por exemplo) destinado a aplicativos cujo maior objetivo é ficar monitorando alguma coisa. Exemplos de aplicativos comuns de serem encontrados nessa área são os antivirus, o software que monitora a atualização do sistema operacional, alguns aplicativos de comunicação instantânea como skype e o msn, etc. Com a elevada capacidade de processamento das máquinas e a quantidade cada vez maior de aplicativos instalados, esse área costuma ficar bastante disputada.

No java o nome dado a classe que cuida dessa área também é chamada de SystemTray e o objeto que colocamos nessa área é chamado de TrayIcon. Por se tratar de uma área de controle do sistema operacional a classe SystemTray não permite a construção de um objeto, isso fica a cargo da máquina virtual. A classe em si nos fornece uma referência a está área, através do método "getSystemTray()". Vale lembrar que nem todo sistema operacional, neste caso o termo mais correto é sistema de janelas já que o sistema operacional é uma camada mais baixa, possui o disponibiliza uma área System Tray. Neste caso é acoselhável descobrir antes se existe suporte para só depois solicitar uma refêrencia a área. Para descobrir se existe suporte, basta utilizar o método estático "isSupported()" da classe SystemTray.


A classe TrayIcon nos fornece todos os recursos necessários para disponilizarmos um ícone na System Tray, configuramos mensagens quando o mouse pousar sobre o ícone, adicionarmos um menu, enviarmos mensagem pro usuário (muito comum nos aplicativos de atualização, quando uma atualização está disponível aguardando a confirmação do usuário), entre outros métodos.

 
Agora que temos uma refência a área System Tray e um objeto do tipo TrayIcon, basta adiciona-lo na área ... fácil, não?



O exemplo a seguir é bastante simples porém demonstra grande parte dos métodos dessas duas classes. O objetivo deste pequeno aplicativo é colocar um icone na system tray e ficar alternado a cor de exibição, como em um semáforo. Ao passar o mouse sobre o icone ele irá mostrar a mensagem (toolTip) "Java Milk Blog - System Tray", o duplo clique com o botão esquerdo irá mostrar uma mensagem de aviso e um clique com o botão esquerdo irá exibir o menu.


Segue o código da aplicação, como sempre, bastante detalhado:


package javamilk;

import java.awt.AWTException;
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 javax.swing.Timer;


/**
* O objetivo desta classe é desmonstra de modo simples o uso da System Tray
* do sistema operacional, disponibilizando um icone nesta área e enviando
* mensagens pro usuário em um período de tempo predeterminado.
* @author giuliano
*/
public class JavaMilk {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

//Antes de mais nada, vamos checar se a plataforma em que está
//sendo executado este aplicativo possui algum tipo de System Tray
if(!SystemTray.isSupported()){
//se não é suportado, encerramos por aqui
System.err.println("System Tray não suportado nesta plataforma.");
}
//caso contrário, podemos seguir adiante, pegando uma referência
//a esta área
SystemTray systemTray = SystemTray.getSystemTray();

//Vamos declarar uma imagem (icone) que usaremos para representarmos
//nosso aplicativo na SystemTray
final Image icon1 = Toolkit.getDefaultToolkit().getImage("verde.png");
final Image icon2 = Toolkit.getDefaultToolkit().getImage("amarelo.png");
final Image icon3 = Toolkit.getDefaultToolkit().getImage("vermelho.png");
//Vamos atribuir essa imagem ao icone do system tray


//Vamos criar um menu popup para nosso aplicativo
PopupMenu menu = new PopupMenu();
MenuItem itemSair = new MenuItem("Sair");
itemSair.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
menu.add(itemSair);

//Este será o objeto que colocaremos na System Tray do SO
final TrayIcon trayIcon;
//Adicionamos o icone e o menu no objeto que colocaremos na system tray
trayIcon = new TrayIcon(icon1, "Java Milk Blog - System tray", menu);
//Pra evitar que a imagem seja cortada, façamos o auto ajuste
trayIcon.setImageAutoSize(true);
//Vamos adicionar eventos a esse objeto

trayIcon.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
trayIcon.displayMessage("Quer saber como fechar este aplicativo?",
"Clique com o botão direito", TrayIcon.MessageType.INFO);
}
});


try
{
//Agora que temos o objeto pronto podemos enfim adiciona-lo na tray
systemTray.add(trayIcon);
}
catch (AWTException ex)
{
System.err.println("Não foi possivel adicionar objeto na system tray");
}

//Vamos adicionar um timer pra ficar mudando o icone do objeto
Timer timer = new Timer(3000,new ActionListener(){

public void actionPerformed(ActionEvent e)
{      
if(trayIcon.getImage()==icon1){
trayIcon.setImage(icon2);
}
else if(trayIcon.getImage()==icon2){
trayIcon.setImage(icon3);
}
else{
trayIcon.setImage(icon1);
}
}
});
timer.start();
}
}

Grande abraço e até o próximo post.

Referências:
Livro Java Core - Volume II (Advanced Features) - 8a edição

Nenhum comentário:

Postar um comentário