quarta-feira, 25 de junho de 2008

Colocando sua aplicação na SystemTray

O java 6 trouxe uma série de recursos novos e interessantes para aplicações desktop. Um deles, e que há muito era solicitado, é o de colocar uma aplicação java para rodar na SystemTray. SystemTray para quem não sabe é aquela espacinho que fica perto do relógio onde normalmente você tem um monte de ícones, que são também um monte de programa rodando. Bom, mas não fique triste se você ainda não tem o java 6 na sua máquina (não sei porquê, mas tudo bem), pois existe uma solução para fazer isso no java 5, que é a biblioteca JDIC.
Iremos fazer uma aplicação besta, que não faz absolutamente nada a não ser colocar o programa na tray. Mas explicaremos aqui os principais conceitos para você fazer programas de gente grande com esse novo recurso. Então vamos ao código. \o/
Iremos supor que você já sabe java :) e assim iremos pular alguns conceitos básicos.
Se você não quiser ter trabalho lendo tudo isso aqui, você pode também baixar o projeto protinho. Coloquei alguns comentários no código fonte pra dar uma ajudinha.


import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
*
* @author Robson de Araújo - http://javeiro.blogspot.com
*/
public class Janela extends JFrame{
private JButton botao;
private TrayIcon trayIcon;

public Janela() {
setTitle("Minha Janela");
setLayout(new FlowLayout());
add(botao = new JButton("Enviar para a tray"));
criarTrayIcon();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(200,100);
setLocationRelativeTo(null);
adicionarListeners();
setVisible(true);
}

// habilita os listeners
private void adicionarListeners(){
addWindowListener(new WindowAdapter() {
@Override
public void windowIconified(WindowEvent e) {
adicionarATray();
}
});

botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
adicionarATray();
}
});
}

private void criarTrayIcon() {
SystemTray tray = SystemTray.getSystemTray();
// Verifica se o sistema suporta ícones na system tray
if (!tray.isSupported()) {
System.out.println("Não é possível executar a app");
System.exit(0);
}

//icone q será exibido na bandeja
ImageIcon icon = new ImageIcon("images/icone.gif");
setIconImage(icon.getImage());

// cria um menu popup para interagir com a aplicação na system tray
PopupMenu menu = new PopupMenu();
MenuItem itemRestaurar = new MenuItem("Restaurar");
itemRestaurar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// remove a aplicação da tray
SystemTray.getSystemTray().remove(trayIcon);
setVisible(true);
}
});

MenuItem itemSair = new MenuItem("Sair");
itemSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

menu.add(itemRestaurar);
menu.add(itemSair);

// cria o ícone e adiciona o menu a ele
trayIcon = new TrayIcon(icon.getImage(), "Server",menu);
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
SystemTray.getSystemTray().remove(trayIcon);
setVisible(true);
}
}
});
}

private void adicionarATray() {
try {
// esconde a janela
dispose();
//adiciona seu programa a systema tray
SystemTray.getSystemTray().add(trayIcon);
// aquele balãozinho que aparece qdo o programa tá lá :)
trayIcon.displayMessage("Minha Janela", "Minha Janela está executando.", TrayIcon.MessageType.INFO);
} catch (AWTException ex) {
System.out.println(ex.getMessage());
}
}

public static void main(String[] args) {
new Janela();
}
}



  • Aplicação executando :)





  • Aplicação executando na SystemTray






  • Menu da aplicação na SystemTray







  • Se você desejar aprender mais sobre SystemTray é só visitar o site do Java que foi de onde eu tirei parte deste tutorial. Por enquanto é isso. Até o próximo post!

Um comentário: