Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Minimizar aplicación al SystemTray/Bandeja del Sistema

Minimizar aplicación al SystemTray/Bandeja del Sistema

Autor jc mouse lunes, junio 11, 2012

El SystemTray/Bandeja del Sistema o como también se le llama “Área de Notificación” es la sección de la barra de tareas de Windows que por lo general se encuentra en la parte inferior izquierda de la pantalla, osea donde se ve el reloj 🙂 , como su nombre indica es un área de notificación que nos informa o alerta, según sea el caso con mensajes en forma de burbujas de lo que sucede en el sistema, algunos programas como el antivirus, reproductores de audio, impresoras, etc.

java system

Para agregar una aplicación hecha en java en el área de notificación, la API de java cuenta con SystemTray TrayIcon.

Como se ve en a imagen superior, la siguiente clase llamada MySystemTray.java, nos permite agregar nuestra aplicación en el Área de Notificación fácilmente, cuando se minimiza la aplicación esta se oculta y se añade al SystemTray,  ademas esta clase implementa un menú emergente PopUp para salir de la aplicación o restaurar la ventana de la misma.

Por lo general cuando se coloca una aplicación en el SystemTray es porque se quiere ocultar el programa pero por otro lado, se quiere seguir trabajando con el, es por eso que, está clase añade un Timer para ejecutar una acción en segundo plano, solo cuando la aplicación este minimizada, la acción del Timer se ejecutara cada 12 segundos, para este ejemplo, se utiliza algo tan trivial como una suma de dos números 🙂 pero bien podria ser que el sistema controle la descarga de un archivo o la conexión a Internet, etc, también se puede implementar eventos del ratón al TrayIcon, cuando se realiza un clic sobre el icono, muestra un mensaje del señor Stephen Wozniak 

system tray

El código de la clase MySystemTray.java es:

package net.jc_mouse.stray;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class MySystemTray {
    
    private JFrame parent;
    private PopupMenu popup = new PopupMenu();
    private final Image image =new ImageIcon(getClass().getResource("/net/jc_mouse/stray/resources/bolivia-flag.png")).getImage() ;
    private final TrayIcon trayIcon = new TrayIcon(image, "Mi Aplicación", popup);    
    private Timer timer;        
    
    /**
     * Constructor de clase
     * @param frame
     */
    public MySystemTray( JFrame frame)
    {
    this.parent = frame;
    //comprueba si SystemTray es soportado en el sistema
    if (SystemTray.isSupported())
    {
      //obtiene instancia SystemTray
      SystemTray systemtray = SystemTray.getSystemTray();
      trayIcon.setImageAutoSize(true);
        
      //acciones del raton sobre el icono en la barra de tareas
        MouseListener mouseListener = new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent evt) {            

                //Si se presiona con el boton izquierdo en el icono
                //y la aplicacion esta minimizada se muestra una frase
                if( evt.getButton() == MouseEvent.BUTTON1 && parent.getExtendedState()==JFrame.ICONIFIED ){
                        MensajeTrayIcon("Steve Wozniak\n \"El Internet de las cosas es el futuro,\n todos los dispositivos conectados todo el tiempo\"", MessageType.WARNING);
                }            
            }

            @Override
            public void mouseEntered(MouseEvent evt) {/*nada x aqui circulen...*/}

            @Override
            public void mouseExited(MouseEvent evt) {/*nada x aqui circulen...*/}

            @Override
            public void mousePressed(MouseEvent evt) {/*nada x aqui circulen...*/}

            @Override
            public void mouseReleased(MouseEvent evt) {/*nada x aqui circulen...*/}
        };

        /* ----------------- ACCIONES DEL MENU POPUP --------------------- */
        //Salir de aplicacion
        ActionListener exitListener = (ActionEvent e) -> {
            System.exit(0);
        };
        
        //Restaurar aplicacion
        ActionListener restoreListener = (ActionEvent e) -> {
            //si esta minimizado restaura JFrame
            if(parent.getExtendedState()== JFrame.ICONIFIED){
                parent.setVisible(true);
                parent.setExtendedState( JFrame.NORMAL );
                parent.repaint();                
                if(timer!=null) timer.cancel();
            }            
        };
    
        //Se crean los Items del menu PopUp y se añaden
        MenuItem exitAppItem = new MenuItem("Salir");
        exitAppItem.addActionListener(exitListener);
        popup.add(exitAppItem);

        MenuItem restoreAppItem = new MenuItem("Restaurar");
        restoreAppItem.addActionListener(restoreListener);
        popup.add(restoreAppItem);
        
        /* ----------------- ACCIONES DEL MENU POPUP : END ---------------- */
        
        trayIcon.addMouseListener(mouseListener);

        //Añade el TrayIcon al SystemTray
        try {
            systemtray.add(trayIcon);
        } catch (AWTException e) {
            System.err.println( "Error:" + e.getMessage() );
        }
    } else {
        System.err.println( "Error: SystemTray no es soportado" );
        return;
    }

    //Cuando se minimiza JFrame, se oculta para que no aparesca en la barra de tareas
    parent.addWindowListener(new WindowAdapter(){
        @Override
        public void windowIconified(WindowEvent e){
           parent.setVisible(false);//Se oculta JFrame
           //Se inicia una tarea cuando se minimiza           
           if(timer!=null) timer.cancel();
           timer = new Timer();           
           timer.schedule(new MyTimerTask(),2000, 12000 );//Se ejecuta cada 12 segundos
        }
    });

    }

    //Muestra una burbuja con la accion que se realiza
    public void MensajeTrayIcon(String texto, MessageType tipo)
    {
        trayIcon.displayMessage("Mi Aplicación dice:", texto, tipo);        
    }
    
    /**
     * clase interna que manejara una accion en segundo plano
     */
    class MyTimerTask extends TimerTask {
        
        @Override
        public void run() {            
            actionBackground();
        }

        /**
         * accion a realizar cuando la aplicacion a sido minimizada
         */
        public void actionBackground()
        { 
            int num1 = (int) Math.floor(Math.random()*6+1);
            int num2 = (int) Math.floor(Math.random()*6+1);
            MensajeTrayIcon("Haciendo algo: " + num1 + " + " + num2 +  " = "+ (num1+num2), MessageType.INFO);                        
        }

    }
}

OJO: En la variable de tipo IMAGE, debemos pasar un archivo de imagen que servirá como icono para mostrar cuando nuestra aplicación este minimizada. La imagen debe ser pequeña, de 16×16 0 32×32 pixeles

Para implementar esta clase en nuestro programa, solo debemos crear una instancia nueva y pasar en el constructor a nuestro JFrame principal, es decir:

package net.jc_mouse.stray;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class TestSTrayFrame extends JFrame {
    
    MySystemTray mySystemTray = new MySystemTray( this );
    
    public TestSTrayFrame(){
        initComponents();
        TestSTrayFrame.this.setLocationRelativeTo(null);
    }
    
    private void initComponents(){
        setTitle("Test SystemTray java");
        setSize(new Dimension(400,300));
        setPreferredSize(new Dimension(400,300));
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        
    }
    
     public static void main(String args[]){
        EventQueue.invokeLater(() -> {
            new TestSTrayFrame().setVisible(true);
        });
    }
}//end class

Eso es todo, ya tenemos nuestra aplicación con soporte para SystemTray 🙂

Proyecto utilizado en este ejemplo HERE 

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Qulqi: Convierte números a letras en java

Qulqi: Convierte números a letras en java

Hola 🙂 publicando de tiempo les dejo esta chiti librería java para convertir números a su equivalente literal. La librer...

Contraseñas con emojis en java

Contraseñas con emojis en java

Semanas atrás leí un articulo en el que se pensaba implementar los emojis como contraseñas en los dispositivos con andro...

Conversor decimal a binario

Conversor decimal a binario

Desde que Google anuncio de que dejara de dar soporte al plugin de Eclipse y se concentrara en Android Studio, quienes t...

Reproducir video en JFrame Swing con JavaFX

Reproducir video en JFrame Swing con JavaFX

JavaFX un producto de  Sun Microsystems/Oracle Corporation que salio a la luz para competir con tecnologías como Flash o...

Combatiendo la censura en Internet

Combatiendo la censura en Internet

La Asamblea General de la Organización de las Naciones Unidas (ONU) en uno de esos extraños momentos de lucidez aprobó u...

Pequeño pero poderoso editor de texto para Ubuntu

Pequeño pero poderoso editor de texto para Ubuntu

Geany es un editor de texto para Sistemas Operativos Linux, windows y MAC que utiliza el kit de herramientas GTK+ con ca...

9 comentarios en “Minimizar aplicación al SystemTray/Bandeja del Sistema”

  1. Do-nata dice:

    hey brother gracias por los tutos, soy fan tuyo xD…espero sigas sacando tips/proyectos para programadores novatos como yo 😀
    Un saludo desde Peru:D

  2. ¿qué hora tienes en el PC? ¿43:04 pm? xD

    1. Mouse dice:

      es que mi reloj vuela 😉

  3. john dice:

    como puedo determinar el tiempo de duracion del globo…

    1. Mouse dice:

      el globo solo dura unos segundos, pero si quieres que se muestre más tiempo lo vuelves a llamar con timer

  4. Peterboy dice:

    Excelente trabajo.

  5. Antonny k. dice:

    Hace tiempo que quería ver como se hacía ello pero no encontraba información, y es que estaba usando mal las palabras clave para buscar. Muchas gracias por el aportazo!

  6. ernesto dice:

    Hola, muchas gracias por el aporte.
    Lo probe en mac y tiene un problema. Al minimizar la ventana va muy bien, pero cuando al restaurar aparece y desaparece.
    Si encuentro algo lo publico saludos.
    http://stackoverflow.com/questions/12812094/jframe-is-not-refreshed-after-minimize-on-mac-os-x

    1. ernesto dice:

      Cuando se oculte el icono en vez de poner:

      parent.setVisible(false);

      hay que cambiarlo por:

      parent.setExtendedState(JFrame.ICONIFIED);

      no lo intente en las de mas plataformas pero ya debería ser mas sencillo.

      Saludos.

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

“MyBatis es una herramienta de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacena...

MyBatis es un framework de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados a part...

Webcam Capture es un API  que permite usar una cámara web incorporada o externa directamente desde código Java utilizand...

im4java es una interfaz pura de Java para la línea de comandos de ImageMagick. La interfaz de la línea de comandos de IM...

Herramientas

Generador de Enlaces a Whatsapp