Correr aplicación en segundo plano en java

publicado por: Anonymous

¿Cómo puedo hacer para que mi JFrame se inicie en segundo plano en el SystemTray?

Tengo la clase Notificacion la cual hago:

    private JFrame parent;
    private PopupMenu popup = new PopupMenu();
    private final Image image = new ImageIcon(getClass().getResource("Notificacion.png")).getImage();
    private final TrayIcon trayIcon = new TrayIcon(image, "Notificacion.png", popup);
//para el Timer
    private Timer timer;
    ///////////////////////////
    SystemTray systemTray;

Constructor:

public Notificacion(JFrame frame) {
        this.parent = frame;
        instanciarTray();
        segundoPlano();
    }

Métodos instanciarTray() y segundoPlano():

private void instanciarTray(){
        trayIcon.setImageAutoSize(true);
        systemTray = SystemTray.getSystemTray();
    }

    private void segundoPlano() {
        try {
            if (SystemTray.isSupported()) {
                systemTray.add(trayIcon);
                parent.setVisible(false);

                //Se inicia una tarea cuando se minimiza           
                if (timer != null) {
                    timer.cancel();
                }
                timer = new Timer();
                timer.schedule(new miTimerTask(), 2000, 5000);//Se ejecuta cada 5 segundos
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR);
        }
    }

Pero cuando inicia mi aplicación no se ejecuta en segundo plano, ¿qué estoy haciendo mal?

Desde el JFrame llamo a la clase de la siguiente forma:

Notificacion notificacion = new Notificacion(this);

solución

EDITADO:

He estado investigando un poco y lo más lógico es tomar otra solución:
No crees un JFrame de inicio, simplemente añade un icono a la barra de tareas y, cuando el usuario pulse sobre el icono, entonces creas tu JFrame. Del mismo modo, destruye el JFrame cuando se pulse cerrar o minimizar. Te pongo un ejemplo completamente funcional, sólo tienes que modificar la parte en la que asigna la imagen del icono:

package gui;

import java.awt.AWTException;
import java.awt.Frame;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Main {


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static JFrame mainFrame;

    private static void showFrame() {
        mainFrame= new JFrame("Título de la ventana");
        mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        mainFrame.setSize(300, 200);
        mainFrame.setVisible(true);
        mainFrame.addWindowStateListener(new WindowStateListener() {

            @Override
            public void windowStateChanged(WindowEvent arg0) {
                if (arg0.getNewState() == Frame.ICONIFIED) {
                    mainFrame.dispose();
                }

            }
        });
    }

    private static void createAndShowGUI() {
        // Check the SystemTray support
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray no soportado");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon = new TrayIcon(createImage("/icon.png", "Icono"));
        final SystemTray tray = SystemTray.getSystemTray();

        // Create a popup menu components
        MenuItem aboutItem = new MenuItem("Abrir ventana");

        MenuItem exitItem = new MenuItem("Salir");

        // Add components to popup menu
        popup.add(aboutItem);
        popup.addSeparator();

        popup.add(exitItem);

        trayIcon.setPopupMenu(popup);

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
            return;
        }

        trayIcon.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Esto sale al hacer doble click en el icono");
            }
        });

        aboutItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                showFrame();
            }
        });

        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tray.remove(trayIcon);
                System.exit(0);
            }
        });
    }

    // Obtain the image URL
    protected static Image createImage(String path, String description) {
        URL imageURL = Main.class.getResource(path);

        if (imageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            return (new ImageIcon(imageURL, description)).getImage();
        }
    }
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *