Eu fiz uma biblioteca básica para os meus projeto usarem o tray.
Bom, você já colocou para iniciar com o WINDOWS certo?
Você pode fazer assim:
Na inicialização com o WINDOWS, inicie o programa passando um argumento que indique que o mesmo deve iniciar no “tray”. Segue um código de exemplo, onde uso essa biblioteca:
import diegoqueres.bibliotecas.iconenotray.IconeNoTray;
import javax.swing.*;
public class JFramePrincipal extends javax.swing.JFrame {
private IconeNoTray trayManager;
public JFramePrincipal(String args[]) {
initComponents();
setIconImage(ICONE.getImage());
// inicializando componentes da janela
//...
//Aqui eu adiciono funções extras no menu TRAY do programa
final MenuItem[] itensExtrasMenu = new MenuItem[1];
itensExtrasMenu[0] = new MenuItem("Registrar ponto");
itensExtrasMenu[0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFramePrincipal.this.jButtonRegistrarPontoActionPerformed(e);
}
});
trayManager = new IconeNoTray(this, ICONE);
trayManager.setBalaoSistemaTitulo("Registro de Ponto");
trayManager.setToolTipText("Registro de Ponto");
trayManager.setBalaoSistemaDescricao("Sistema de Ponto ocultado. Para desocultar, abra o submenu e clique em Restaurar");
trayManager.criarTrayIcon(itensExtrasMenu);
//Se o argumento que inicializa o programa é igual a modo_oculto...
if (args != null && args.length >= 1 && args[0].equals("modo_oculto")) {
try {
trayManager.adicionarATray(); //inicializa o programa já ocultado na tray
} catch (Exception ex) {
setVisible(true);
ex.printStackTrace();
}
} else {
setVisible(true);
}
}
O jar você não vai conseguir rodar, porquê é uma biblioteca. Você deve adicionar ao CLASSPATH do seu programa.
Daí você usa as classes que estão nele no seu programa (igual ao que eu to fazendo no código de exemplo e roda o código do seu projeto).
Ou seja, esse código você deve inserir no seu programa e alterá-lo, conforme suas necessidades.
Daí você roda o seu programa para ver funcionando:
trayManager = new IconeNoTray(this, ICONE);
trayManager.setBalaoSistemaTitulo("Registro de Ponto");
trayManager.setToolTipText("Registro de Ponto");
trayManager.setBalaoSistemaDescricao("Sistema de Ponto ocultado. Para desocultar, abra o submenu e clique em Restaurar");
trayManager.criarTrayIcon(itensExtrasMenu);
//Se o argumento que inicializa o programa é igual a modo_oculto...
if (args != null && args.length >= 1 && args[0].equals("modo_oculto")) {
try {
trayManager.adicionarATray(); //inicializa o programa já ocultado na tray
} catch (Exception ex) {
setVisible(true);
ex.printStackTrace();
}
} else {
setVisible(true);
}
A varíavel ICONE é um objeto javax.swing.ImageIcon
Você seta dessa forma:
public final static javax.swing.Icon ICONE = new javax.swing.ImageIcon(getClass().getResource("/path_de_pacotes_da_sua_aplicacao/imagens/icone_aplicacao.png"));
Você indica o caminho da imagem que é o ícone do seu programa no construtor. Nesse caso, a imagem está empacotada no seu programa. Daí eu uso getClass().getResource(…) para chegar no caminho dentro do jar
/*
* IconeNoTray
*
* Biblioteca auxiliar para minimizar programas para o Tray
*/
package diegoqueres.bibliotecas.iconenotray;
import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
public class IconeNoTray {
private boolean suportaTrayIcon;
private TrayIcon trayIcon;
private Window parent;
private String[] textoMenu = {"Restaurar", "Sair"};
private ImageIcon icone;
private String toolTipText = "Programa";
private String balaoSistemaTitulo = "Meu programa";
private String balaoSistemaDescricao = "O meu programa está executando";
/**
* Construtor. Define as características do objeto IconeNoTray
*
* @param parent Janela pai
* @param textoMenu Vetor de 2 Strings onde:
* <br><b>Índice 0 - </b> É o texto que deve aparecer no menu do <i>Tray</i> para simbolizar restauração da janela
* <br><b>Índice 1 - </b> É o texto que deve aparecer no menu do <i>Tray</i> para simbolizar a saída do programa
* @param icone Objeto <i>ImageIcon</i> que será o ícone localizado no Tray
* @param toolTipText Texto que irá aparecer ao passar o mouse sobre o ícone no tray
* @param balaoSistemaTitulo Balão de Status do Sistema Operacional - Título
* @param balaoSistemaDescricao Balão de Status do Sistema Operacional - Descrição
* @param itensExtras Itens de menu extras no menu do tray
*/
public IconeNoTray(
Window parent,
String[] textoMenu,
ImageIcon icone,
String toolTipText,
String balaoSistemaTitulo,
String balaoSistemaDescricao,
MenuItem[] itensExtras)
{
this.parent = parent;
this.textoMenu = textoMenu;
this.icone = icone;
this.toolTipText = toolTipText;
this.balaoSistemaTitulo = balaoSistemaTitulo;
this.balaoSistemaDescricao = balaoSistemaDescricao;
setSuportaTrayIcon(true);
criarTrayIcon(itensExtras);
}
/**
* Construtor. Define as características do objeto IconeNoTray
*
* @param parent Janela pai
* @param textoMenu Vetor de 2 Strings onde:
* <br><b>Índice 0 - </b> É o texto que deve aparecer no menu do <i>Tray</i> para simbolizar restauração da janela
* <br><b>Índice 1 - </b> É o texto que deve aparecer no menu do <i>Tray</i> para simbolizar a saída do programa
* @param icone Objeto <i>ImageIcon</i> que será o ícone localizado no Tray
* @param toolTipText Texto que irá aparecer ao passar o mouse sobre o ícone no tray
* @param balaoSistemaTitulo Balão de Status do Sistema Operacional - Título
* @param balaoSistemaDescricao Balão de Status do Sistema Operacional - Descrição
*/
public IconeNoTray(
Window parent,
String[] textoMenu,
ImageIcon icone,
String toolTipText,
String balaoSistemaTitulo,
String balaoSistemaDescricao)
{
this.parent = parent;
this.textoMenu = textoMenu;
this.icone = icone;
this.toolTipText = toolTipText;
this.balaoSistemaTitulo = balaoSistemaTitulo;
this.balaoSistemaDescricao = balaoSistemaDescricao;
setSuportaTrayIcon(true);
criarTrayIcon();
}
/**
* Construtor simplificado - define parcialmente as características do objeto
* @param parent <i>java.awt.Window</i> Janela pai
* @param icone <i>ImageIcon</i> Ícone que será usado no tray
*/
public IconeNoTray(Window parent, ImageIcon icone) {
this.parent = parent;
this.icone = icone;
setSuportaTrayIcon(true);
}
/**
* Método executado na inicialização do objeto, determina as características do ícone que será lançado no tray
*/
public void criarTrayIcon() {
criarTrayIcon(null);
}
/**
* Método executado na inicialização do objeto, determina as características do ícone que será lançado no tray
*/
public void criarTrayIcon(MenuItem[] itensExtras) {
SystemTray tray = SystemTray.getSystemTray();
// Verifica se o sistema suporta Ãcones na system tray
if (!tray.isSupported()) {
setSuportaTrayIcon(false);
return;
}
//icone q será exibido na bandeja
//ImageIcon icon = new ImageIcon("running.png");
//setIconImage(icon.getImage());
// cria um menu popup para interagir com a aplicação na system tray
PopupMenu menu = new PopupMenu();
MenuItem itemRestaurar = new MenuItem(textoMenu[0]);
itemRestaurar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// remove a aplicação da tray
SystemTray.getSystemTray().remove(trayIcon);
parent.setVisible(true);
}
});
menu.add(itemRestaurar);
if (itensExtras != null) {
for (MenuItem item : itensExtras) {
menu.add(item);
}
}
MenuItem itemSair = new MenuItem(textoMenu[1]);
itemSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(itemSair);
// cria o ícone e adiciona o menu a ele
trayIcon = new TrayIcon(icone.getImage(), toolTipText, menu);
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
SystemTray.getSystemTray().remove(trayIcon);
parent.setVisible(true);
}
}
});
}
public void adicionarATray() throws AWTException {
if (isSuportaTrayIcon()) {
// esconde a janela
parent.dispose();
//adiciona seu programa a systema tray
SystemTray.getSystemTray().add(trayIcon);
// aquele balãozinho que aparece qdo o programa tá lá :)
trayIcon.displayMessage(balaoSistemaTitulo, balaoSistemaDescricao, TrayIcon.MessageType.INFO);
}
}
public void setBalaoSistemaDescricao(String balaoSistemaDescricao) {
this.balaoSistemaDescricao = balaoSistemaDescricao;
}
public void setBalaoSistemaTitulo(String balaoSistemaTitulo) {
this.balaoSistemaTitulo = balaoSistemaTitulo;
}
public void setIcone(ImageIcon icone) {
this.icone = icone;
}
public void setParent(Window parent) {
this.parent = parent;
}
public void setTextoMenu(String[] textoMenu) {
this.textoMenu = textoMenu;
}
public void setToolTipText(String toolTipText) {
this.toolTipText = toolTipText;
}
public void setTrayIcon(TrayIcon trayIcon) {
this.trayIcon = trayIcon;
}
public boolean isSuportaTrayIcon() {
return suportaTrayIcon;
}
public void setSuportaTrayIcon(boolean suportaTrayIcon) {
this.suportaTrayIcon = suportaTrayIcon;
}
}
diego_qmota consegui adicionar seu .jar como biblioteca, e bom com todas estas outras dicas consegui fazer o que queria,
nem sei como agradecer, eu aqui querendo um peixe e você já esta fazendo muito mais e me ensinando a pescar!
por fim tenho uma ultima duvida, teria como eu setar na janela, caso o usuario clique em fechar a janela não feche mais sim volte ao tray?
segue meu codigo caso queira dar uma olhada.
package view;
import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import diegoqueres.bibliotecas.iconenotray.IconeNoTray;
@SuppressWarnings("serial")
public class CFronteiraTeste extends JFrame {
static IconeNoTray trayManager;
public CFronteiraTeste() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(670, 600);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setResizable(false);
}
public static void main(String[] args) {
CFronteiraTeste f = new CFronteiraTeste();
// Aqui eu adiciono funções extras no menu TRAY do programa
final MenuItem[] itensExtrasMenu = new MenuItem[1];
itensExtrasMenu[0] = new MenuItem("testeTry");
itensExtrasMenu[0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("asd");
;
}
});
trayManager = new IconeNoTray(f, new ImageIcon("D:/Desenvolvimento/Java/testeTrayIcon/src/imagemok.png"));
trayManager.setBalaoSistemaTitulo("Registro de Ponto");
trayManager.setToolTipText("Registro de Ponto");
trayManager.setBalaoSistemaDescricao("Sistema de Ponto ocultado. Para desocultar, abra o submenu e clique em Restaurar");
trayManager.criarTrayIcon(itensExtrasMenu);
try {
trayManager.adicionarATray();
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}
Valeu Walkman! Eu quis adicionar essa funcionalidade nos meus programas desktop há um ano atrás e pesquisei sobre o assunto. Nada mais justo que ajudar alguém que está buscando o mesmo resultado, não é mesmo?
E mais uma vez muito obrigado e eu gostaria de lhe sugerir que fizesse um tutorial sobre Tray pelo que pesquisei é algo extremamente escasso.
Ira ser de grande valia para o GUJ.
( Caso o faça me mande o link que vai direto para a minha assinatura! )