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.
Para agregar una aplicación hecha en java en el área de notificación, la API de java cuenta con SystemTray y 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
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!!!
Si te gusta realizar tus propios memes o foto montajes pero tienes poca o nula experiencia en editores gráficos como Pho[...]
Un JSpinner es un componente swing de java con una caja de texto y un par de botones que nos permiten incrementar y dec[...]
Crear una librería swing para java utilizando Netbeans no es nada del otro mundo y la cantidad de código que vayamos a e[...]
Googleando me encontré con una interesante clase java «JpegImagesToMovie» que convierte imágenes JPEG a vídeo MOV de[...]
Cada versión de Linux viene con su propia terminal predeterminada para interactuar con el Sistema Operativo a través de[...]
Las aplicaciones para celulares inteligentes con sistema operativo Android, se distribuyen en archivos *.APK, si como pr[...]