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

JavaSystem TrayMinimize

Java Problem Overview


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?

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

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. :)

Solution 3 - Java

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

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohannesView Question on Stackoverflow
Solution 1 - JavaMichael MyersView Answer on Stackoverflow
Solution 2 - JavaNilesh JadavView Answer on Stackoverflow
Solution 3 - JavaLakshya GoyalView Answer on Stackoverflow