Jumbala
Jumbala

Reputation: 4944

Hiding my program in the System Tray in Windows

I'd like my program to display an icon in the TaskBar Status Area near the clock in Windows and found a way to do so.

The thing is, I'd like my program to stay open in the Status Area if the "X" is pressed on the window, but not in the System Tray, but I have no idea how to do so and searching on Google didn't help (I'm probably not searching the right terms).

Edit: I think I used the wrong terms. I know how to have my program's icon in the notification area, what I'd like is to hide it in the area where it is normally displayed when you minimize a window.

Upvotes: 9

Views: 7273

Answers (4)

sadipan
sadipan

Reputation: 41

import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;

public class HideToSystemTray extends JFrame {
    TrayIcon trayIcon;
    SystemTray tray;
    JButton button;

    HideToSystemTray() {
        super("SystemTray test");
        button = new JButton("Press");
        button.setBounds(10, 10, 40, 40);
        setUndecorated(true);
        getContentPane().add(button);
        System.out.println("creating instance");
        try {
            System.out.println("setting look and feel");
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println("Unable to set LookAndFeel");
        }
        if (SystemTray.isSupported()) {
            System.out.println("system tray supported");
            tray = SystemTray.getSystemTray();

            Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Sandipan\\Desktop\\cutter.png");
            ActionListener exitListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Exiting....");
                    System.exit(0);
                }
            };
            PopupMenu popup = new PopupMenu();
            MenuItem defaultItem = new MenuItem("Exit");
            defaultItem.addActionListener(exitListener);
            popup.add(defaultItem);
            defaultItem = new MenuItem("Open");
            defaultItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    tray.remove(trayIcon);
                    setVisible(true);
                    System.out.println("Tray icon removed");
                }
            });
            popup.add(defaultItem);
            trayIcon = new TrayIcon(image, "SystemTray Demo", popup);
            trayIcon.setImageAutoSize(true);
        } else {
            System.out.println("system tray not supported");
        }

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Execute when button is pressed
                System.out.println("You clicked the button");
                try {
                    tray.add(trayIcon);
                    setVisible(false);
                    System.out.println("added to SystemTray");
                } catch (AWTException ex) {
                    System.out.println("unable to add to tray");
                }
            }
        });


    /*  addWindowStateListener(new WindowStateListener() { 
    public void windowStateChanged(WindowEvent e) { 
        if(e.getNewState()==ICONIFIED){ 
            try { 
                tray.add(trayIcon); 
                setVisible(false); 
                System.out.println("added to SystemTray"); 
            } catch (AWTException ex) { 
                System.out.println("unable to add to tray"); 
            } 
        } 
        if(e.getNewState()==7){ 
            try{ 
                tray.add(trayIcon); 
                setVisible(false); 
                System.out.println("added to SystemTray"); 
            }catch(AWTException ex){ 
                System.out.println("unable to add to system tray"); 
            } 
        } 
        if(e.getNewState()==MAXIMIZED_BOTH){ 
            tray.remove(trayIcon); 
            setVisible(true); 
            System.out.println("Tray icon removed"); 
        } 
        if(e.getNewState()==NORMAL){ 
            tray.remove(trayIcon); 
            setVisible(true); 
            System.out.println("Tray icon removed"); 
        } 
    } 
    }); */
    setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\Sandipan\\Desktop\\cutter.png"));

    setVisible(true);
    setSize(300, 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    new HideToSystemTray();
}
}

Upvotes: 4

camickr
camickr

Reputation: 324118

I know how to have my program's icon in the notification area, what I'd like is to hide it in the area where it is normally displayed when you minimize a window.

Then don't use the system tray.

The thing is, I'd like my program to stay open in the Status Area if the "X" is pressed on the window,

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

Upvotes: 7

David Heffernan
David Heffernan

Reputation: 612954

I guess you want the taskbar button to be removed when you minimise the main form. You achieve this by petting its visible property to false, however you do that with your Java framework.

Upvotes: 2

Vivek Goel
Vivek Goel

Reputation: 24150

System Tray support was added in JavaSE v 6.

you can see example here http://download.oracle.com/javase/7/docs/api/java/awt/SystemTray.html

Upvotes: 6

Related Questions