SystemTray в Java

В Java SE 6 появились два класса, позволяющий получить доступ к области уведомления, которые находятся в пакете java.awt: SystemTray и TrayIcon. Ниже я опишу предназначения классов и их основные методы. До выхода Java SE 6 приходилось пользоваться сторонними библиотеками.

SystemTray - основной класс, представляющий область уведомления. Основной метод класса – метод add, добавляющий объкт TrayIcon, который может выбрасывать исключение AWTException, есть метод remove, удаляющий объект TrayIcon, если в нем больше нет необходимости. Класс SystemTray основан на паттерне Singleton, поэтому доступ к области уведомления осуществляется с помощью статического метода getSystemTray, но для начала необходимо проверить поддерживает ли область уведомления данной платформой, проверку можно выполнить с помощью статического метода isSupported:

SystemTray tray = SystemTray.getSystemTray();

Класс TrayIcon предназначен для отображения пиктограмму в области уведомления (метод setImage). Класс может сам установить оптимальный размер иконки с помощью метода setImageAutoSize, что бывает очень полезно, т.к. не нужно заострять внимание на размере картинки. Кроме того класс TrayIcon может отображать всплывающую подсказку (метод setToolTip) и контекстное меню (метод setPopupMenu). Для установки значений можно воспользоваться конструкторами калсса:

TrayIcon(Image image)
TrayIcon(Image image, String tooltip)
TrayIcon(Image image, String tooltip, PopupMenu popup)

Конструктор класса, которые задает пиктограмму, всплывающую подстказку и контекстное меню.

Наконец, класс TrayIcon позволяет выводить уведомления с помощью метода displayMessage. Существует четыре типа уведомления
  • TrayIcon.MessageType.ERROR
  • TrayIcon.MessageType.INFO
  • TrayIcon.MessageType.NONE
  • TrayIcon.MessageType.WARNING

Код для отображения уведомления:

displayMessage("Заголовок", " Текст", TrayIcon.MessageType.INFO);

TrayIcon может быть источником событий MouseEvents, так же для объекта можно зарегистрировать обработчик ActionListener, который будет срабатывать при двойном щелчке по пиктограмме.

Теперь объединив все вышесказанное, приведу пример:

package com.blogspot.ldisplay;

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SimpleTray {

public static void main(String[] args) {
if (!SystemTray.isSupported()) {
System.err.println("System tray is not supported.");
return;
}
SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("icon.png");

PopupMenu popup = new PopupMenu();
MenuItem exitItem = new MenuItem("Выход");
exitItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popup.add(exitItem);
final TrayIcon trayIcon = new TrayIcon(image, "Всплывающая подсказка", popup);
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
trayIcon.displayMessage("Заголовок",
"Текст сообщения",
TrayIcon.MessageType.INFO);
}
});
try {
tray.add(trayIcon);
} catch (AWTException ex) {
System.err.println("TrayIcon could not be added.");
}
}
}

Напоследок две ссылки на
API по SystemTray: http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html
API по TrayIcon: http://java.sun.com/javase/6/docs/api/java/awt/TrayIcon.html.