[RESOLVIDO]Aplicativo inicializando como trayIcone

Buenas galerinha.

eu tenho um aplicativo que basicamente serve para envio de informações para um servidor.

coloquei ele pra inicializar com o windows, até ai tudo ok

só que eu queria que ele iniciasse sem aparecer a tela dele, que ele iniciasse como um trayIcone.

só quando o usuário clicasse no trayIcone e escolhesse uma opção ele apareceria

e só poderia ser encerado este aplicativo pelo trayIcone.

nunca usei o mesmo por isso estou perdido alguem poderia me ajudar?

vlw.

Boa tarde!

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);
        }

    }


diego_qmota muito obrigado você esta sendo de grande ajuda.

tentei compilar o seu jar, mas não consigo seria? “C:\S\IconeNoTray.jar” modo_oculto

nesta lina

        trayManager = new IconeNoTray(this, ICONE); 

como seto um icone?

vlw.

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

Bom…segue o código da classe IconeNoTray

Você pode incluir diretamente no seu programa

/*
 * 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? :slight_smile:

Bom, para sua nova pergunta, eu não sei como fazer. Mas eu acho que esse tópico pode ajudar: http://www.guj.com.br/java/40229-questionar-saida-em-aplicacao-swing. A diferença é que você vai adicionar no tray, ao invés de confirmar que vai fechar o programa.

Prezado diego_qmota, como sempre me ajudando e muito.
funcionou perfeitamente.

para quem precisar segue o codigo para “REminimizar” o JFrame.

		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				try {
					trayManager.adicionarATray();
				} catch (AWTException e1) {
					e1.printStackTrace();
				}	
			}
		});

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! )

Abraços.

Ok. Só falta arrumar tempo para isso…rs.
Mas fica anotada sua sugestão. Assim que eu puder, eu faço um tutorial sobre o assunto e te comunico. :slight_smile: