How do I put a Java app in the system tray?

I have a little control-panel, just a little application that I made. I would like to minimize/put the control-panel up/down with the systemicons, together with battery life, date, networks etc.

Anyone that can give me a clue, link to a tutorial or something to read?

Answers


As of Java 6, this is supported in the SystemTray and TrayIcon classes. SystemTray has a pretty extensive example in its Javadocs:

TrayIcon trayIcon = null;
if (SystemTray.isSupported()) {
    // get the SystemTray instance
    SystemTray tray = SystemTray.getSystemTray();
    // load an image
    Image image = Toolkit.getDefaultToolkit().getImage("your_image/path_here.gif");
    // create a action listener to listen for default action executed on the tray icon
    ActionListener listener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // execute default action of the application
            // ...
        }
    };
    // create a popup menu
    PopupMenu popup = new PopupMenu();
    // create menu item for the default action
    MenuItem defaultItem = new MenuItem(...);
    defaultItem.addActionListener(listener);
    popup.add(defaultItem);
    /// ... add other items
    // construct a TrayIcon
    trayIcon = new TrayIcon(image, "Tray Demo", popup);
    // set the TrayIcon properties
    trayIcon.addActionListener(listener);
    // ...
    // add the tray image
    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.err.println(e);
    }
    // ...
} else {
    // disable tray option in your application or
    // perform other actions
    ...
}
// ...
// some time later
// the application state has changed - update the image
if (trayIcon != null) {
    trayIcon.setImage(updatedImage);
}
// ...

You could also check out this article, or this tech tip.


It's very simple

import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class SystemTrayDemo{

//start of main method
public static void main(String []args){
    //checking for support
    if(!SystemTray.isSupported()){
        System.out.println("System tray is not supported !!! ");
        return ;
    }
    //get the systemTray of the system
    SystemTray systemTray = SystemTray.getSystemTray();

    //get default toolkit
    //Toolkit toolkit = Toolkit.getDefaultToolkit();
    //get image 
    //Toolkit.getDefaultToolkit().getImage("src/resources/busylogo.jpg");
    Image image = Toolkit.getDefaultToolkit().getImage("src/images/1.gif");

    //popupmenu
    PopupMenu trayPopupMenu = new PopupMenu();

    //1t menuitem for popupmenu
    MenuItem action = new MenuItem("Action");
    action.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null, "Action Clicked");          
        }
    });     
    trayPopupMenu.add(action);

    //2nd menuitem of popupmenu
    MenuItem close = new MenuItem("Close");
    close.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);             
        }
    });
    trayPopupMenu.add(close);

    //setting tray icon
    TrayIcon trayIcon = new TrayIcon(image, "SystemTray Demo", trayPopupMenu);
    //adjust to default size as per system recommendation 
    trayIcon.setImageAutoSize(true);

    try{
        systemTray.add(trayIcon);
    }catch(AWTException awtException){
        awtException.printStackTrace();
    }
    System.out.println("end of main");

}//end of main

}//end of class

Set appropriate path for image and then run the program. t.y. :)


This is the code you can use to access and customize the system tray:

final TrayIcon trayIcon;

if (SystemTray.isSupported()) {

SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");

MouseListener mouseListener = new MouseListener() {

    public void mouseClicked(MouseEvent e) {
        System.out.println("Tray Icon - Mouse clicked!");                 
    }

    public void mouseEntered(MouseEvent e) {
        System.out.println("Tray Icon - Mouse entered!");                 
    }

    public void mouseExited(MouseEvent e) {
        System.out.println("Tray Icon - Mouse exited!");                 
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("Tray Icon - Mouse pressed!");                 
    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("Tray Icon - Mouse released!");                 
    }
};

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);

trayIcon = new TrayIcon(image, "Tray Demo", popup);

ActionListener actionListener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        trayIcon.displayMessage("Action Event", 
            "An Action Event Has Been Performed!",
            TrayIcon.MessageType.INFO);
    }
};

trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(actionListener);
trayIcon.addMouseListener(mouseListener);

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

} else {

//  System Tray is not supported

}

Need Your Help

How serious is this new ASP.NET security vulnerability and how can I workaround it?

asp.net .net security padding-oracle-attack

I've just read on the net about a newly discovered security vulnerability in ASP.NET. You can read the details here.

cipher class and mcrypt_create_iv is slow at times

php mcrypt encryption

I am having an issue with my cipher class. At times it is very fast. Sometimes however it is slow. the code Im using is as follows