quarta-feira, 9 de maio de 2007

Java 6 - Criando uma aplicação na SystemTray

Olá, continuando com a sequência "O que o Java 6 trouxe de novo" irei falar um pouquinho de uma importante nova funcionalidade adicionada na nova versão do Java, O SystemTray.
O SystemTray é para deixar os programas em um icone que fica na bandeja do sistema operacional (aquela do lado do relógio), o Java na versão 6 trouxe isso nativo na JDK, nas versões anteriores isso era feito utilizando a biblioteca JDIC.

E para ilustar vou dar um exemplo de como criar uma aplicação na bandeja, como várias pessoas me pediram isso, está ai, é bem simples:

import java.awt.Image;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
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.ImageIcon;
import javax.swing.JOptionPane;

/**
*
* @author Emmanuel Silva
*/
public class TestTray {

/** Creates a new instance of SisTray */
public TestTray() {
createSystemTray();
}

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

private void createSystemTray() {

//criando a classe que gerencia a bandeja
SystemTray tray = SystemTray.getSystemTray();
if(!tray.isSupported()) {
System.err.println("Não é possível rodar a aplicação");
System.exit(0);
}

//icone que será exibido na bandeja
Image icon = Toolkit.getDefaultToolkit().createImage( getClass().getResource("informacao.gif").getPath());

PopupMenu menu = new PopupMenu();

//item para sair
MenuItem itemSair = new MenuItem("Sair");
itemSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(itemSair);

//item para uma opção qualquer
MenuItem itemOption = new MenuItem("Opção");
itemOption.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "E ai gostou?");
}
});
menu.add(itemOption);

TrayIcon trayIcon = new TrayIcon(icon, "Tooltip", menu);

try {
//adiciona na bandeja do sistema
tray.add(trayIcon);

//exibindo um "tooltip" para o tray
trayIcon.displayMessage("SystemTray Demo", "Você gostou do SystemTray nativo do java?", TrayIcon.MessageType.INFO);
} catch(Exception ex) {
ex.printStackTrace();
}
}

}


O resultado dessa classe é:


Ao clicar com o botão direito em cima do icone:


Bom, espero que gostem;

Até a proxíma!

5 comentários:

tonho1c disse...

Otimo...

procurei que só na net sobre SystemTray...

valeu mesmo...

Anônimo disse...

ótima dica, o único problema que encontrei foi nesta linha abaixo, vc poderia me explicar melhor?
Consegui alterar ela pra rodar mas o ícone não esta embutido no arquivo .jar
Meu email é: leandrocabralmoreira@hotmail.com

Image icon = Toolkit.getDefaultToolkit().createImage( getClass().getResource("anjo.gif").getPath());

High-Tech Formatações disse...
Este comentário foi removido pelo autor.
High-Tech Formatações disse...

Image icon = Toolkit.getDefaultToolkit().createImage("informacao.gif");

Unknown disse...

Ótima dica, gostei muito! No entanto, depois de apanhar um pouco, verifiquei que há uma pequena falha que, potencialmente, poderá gerar erros a depender do contexto onde a aplicação for rodar. Vejamos:

Em sistemas que por ventura o SystemTary não esteja disponível, o método SystemTray.getSystemTray() irá retornar a exceção "java.lang.UnsupportedOperationException" que não está sendo tratada. por isso o correto é que o método isSupported() da API SystemTray, que é estático, seja executado antes da recuperação da instância do SystemTray. O código deveria ficar assim:

if(!SystemTray.isSupported()) {
System.err.println("Não é possível rodar a aplicação");
System.exit(0);
}
SystemTray tray = SystemTray.getSystemTray();

Espero ter contribuído com o autor e os leitores.