Aplicação no SystemTray

4 respostas
java
A

Tô tentando fazer meu app ficar no SystemTray. Ele tá exibindo a imagem, mas nenhuma funcionalidade. Poderiam me explicar o por que e como arrumar?

public class TrayApp {
    public void run() {
        if (SystemTray.isSupported()) {

            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("/home/user/imgs/img.jpg");

            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem("DESKTOP");
            popup.add(item);

            TrayIcon trayIcon = new TrayIcon(image, "TITLE", popup);
            trayIcon.addActionListener(listener);
            trayIcon.setImageAutoSize(true);

            try {
                tray.add(trayIcon);
            } catch (AWTException e) {
                System.err.println("Não pode adicionar a tray");
            }
        } else {
            System.err.println("Tray indisponível");
        }
    }
    ActionListener listener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    };
}

Quando eu coloco o mouse sobre ele, aparece “JavaEmbeddedFrame”, e não a descrição que eu coloquei.

Se SO importa, estou usando Kubuntu.

4 Respostas

A

Testei agora num Linux Mint e ele até apareceu…

staroski

Onde e como você executa a classe TrayApp?
Posta também a classe que contém o método main.

A

Opa @staroski

Descobri que o problema era o KDE. Testei no Win e deu certo.

Agora eu tenho outra dúvida: como posso fazer um método que “mate” apenas o SystemTray, no caso, apenas tire ele da barrinha lá de baixo? Tentei usar o tray.remove(trayIcon); , mas ele quebra minha conexão MQTT…

Explicando melhor, meu aplicativo é um listener MQTT, que quando alguém publica no tópico, ele exibe uma tela para o usuário. Se não publicarem nada, fica rodando suaves lá no segundo plano. O que quero fazer é que quando exibir a tela para o user, um systemTray com algumas opções apareça, e que quando o MQTT falar “PARAR EXIBIÇÃO!”, a view e o Systray sejam “mortos”, mas o listener continua lá. Eu já tenho isso tudo pronto, falta só o lance do systray.

Então, eu chamo o TrayApp no evento que trata a ação enviada pelo MQTT.

private void startView(ClientDTO client) {
        trayRunner.SysTrayRunner();
        mosaico = new MosaicoDesktop(client.getVideos());
        mosaico.playMedias(client);
    }
FearX

O KDE tem esses B.Os mesmo…

Criado 5 de outubro de 2018
Ultima resposta 5 de out. de 2018
Respostas 4
Participantes 3