Java 9. java.awt.Taskbar
от aNNiMON
В Java 9 добавлен специальный класс для взаимодействия с панелью задач. Таким образом, можно более тесно интегрировать Java-приложение с операционной системой.
Однако не все системы имеют панель задач, поэтому сперва следует проверить её поддержку:
Список поддерживаемых методов в Taskbar тоже ограничен, поэтому перед использованием метода нужно проверить, что действие, которое он выполняет, поддерживается. Для этого есть метод boolean isSupported(Taskbar.Feature) и класс перечислений Taskbar.Feature. Код:
выведет на Windows:
ICON_BADGE_IMAGE_WINDOW
PROGRESS_STATE_WINDOW
PROGRESS_VALUE_WINDOW
USER_ATTENTION_WINDOWна Ubuntu:
ICON_BADGE_NUMBER
MENU
PROGRESS_VALUE
USER_ATTENTION
Ознакомимся с каждым ближе.
Taskbar.Feature.ICON_BADGE_TEXT и Taskbar.Feature.ICON_BADGE_NUMBER
Метод: taskbar.setIconBadge(String badge)
Добавляет к иконке приложения текстовую метку. Обычно это может быть число новых уведомлений или непрочитанных сообщений. Некоторые платформы поддерживают только числа в таких метках, поэтому передавать следует число в текстовом представлении:
Taskbar.Feature.ICON_BADGE_IMAGE_WINDOW
Метод: taskbar.setWindowIconBadge(Window w, Image badge)
Добавляет к иконке указанного окна метку в виде изображения. На Windows 7 хоть и писало, что поддерживается, но к иконке ничего не добавлялось, зато на Windows 10 всё работает.
Taskbar.Feature.ICON_IMAGE
Метод: taskbar.setIconImage()
Изменяет иконку приложения в панели задач.
Taskbar.Feature.MENU
Методы: taskbar.getMenu() и taskbar.setMenu(PopupMenu menu)
Позволяет добавить или изменить меню на иконке приложения в панели задач.
Taskbar.Feature.PROGRESS_STATE_WINDOW
Метод: taskbar.setWindowProgressState(Window w, Taskbar.State atate)
Устанавливает состояние прогресса на иконке указанного окна.
На рисунке показаны состояния NORMAL, PAUSED и ERROR соответственно:
Taskbar.Feature.PROGRESS_VALUE
Метод: taskbar.setProgressValue(int value)
Изменяет значение индикатора прогресса для иконки приложения. Значение должно быть от 0 до 100.
Taskbar.Feature.PROGRESS_VALUE_WINDOW
Метод: taskbar.setWindowProgressValue(Window w, int value)
Изменяет значение индикатора прогресса для иконки указанного окна. Значение должно быть от 0 до 100.
Taskbar.Feature.USER_ATTENTION
Метод: taskbar.requestUserAttention(enabled, critical)
Привлекает внимание пользователя мигаем или дрожанием окна (зависит от платформы).
Taskbar.Feature.USER_ATTENTION_WINDOW
Метод: taskbar.requestWindowUserAttention(Window w)
Привлекает внимание пользователя к указанному окну.
Ограничения
К сожалению, на Linux поддерживается только Unity, да и то, её необходимо включать специальным параметром JVM в .desktop файле, которое запускает приложение:
Но даже так ничего не работало. Возможно к релизу Java 9 исправят.
Проект на GitHub: https://github.com/annimon-tutorials/Java-9-Taskbar-Demo
Однако не все системы имеют панель задач, поэтому сперва следует проверить её поддержку:
- if (!Taskbar.isTaskbarSupported()) {
- System.out.println("Taskbar is not supported");
- return;
- }
Список поддерживаемых методов в Taskbar тоже ограничен, поэтому перед использованием метода нужно проверить, что действие, которое он выполняет, поддерживается. Для этого есть метод boolean isSupported(Taskbar.Feature) и класс перечислений Taskbar.Feature. Код:
- final Taskbar taskbar = Taskbar.getTaskbar();
- Arrays.stream(Taskbar.Feature.values())
- .filter(taskbar::isSupported)
- .forEach(System.out::println);
ICON_BADGE_IMAGE_WINDOW
PROGRESS_STATE_WINDOW
PROGRESS_VALUE_WINDOW
USER_ATTENTION_WINDOWна Ubuntu:
ICON_BADGE_NUMBER
MENU
PROGRESS_VALUE
USER_ATTENTION
Ознакомимся с каждым ближе.
Taskbar.Feature.ICON_BADGE_TEXT и Taskbar.Feature.ICON_BADGE_NUMBER
Метод: taskbar.setIconBadge(String badge)
Добавляет к иконке приложения текстовую метку. Обычно это может быть число новых уведомлений или непрочитанных сообщений. Некоторые платформы поддерживают только числа в таких метках, поэтому передавать следует число в текстовом представлении:
- if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_TEXT)) {
- taskbar.setIconBadge("99+");
- }
- if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_NUMBER)) {
- taskbar.setIconBadge("4");
- taskbar.setIconBadge(Integer.toString(numberOfNotifications));
- }
Taskbar.Feature.ICON_BADGE_IMAGE_WINDOW
Метод: taskbar.setWindowIconBadge(Window w, Image badge)
Добавляет к иконке указанного окна метку в виде изображения. На Windows 7 хоть и писало, что поддерживается, но к иконке ничего не добавлялось, зато на Windows 10 всё работает.
- if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_IMAGE_WINDOW)) {
- Image badge = ImageIO.read("badge.png");
- taskbar.setWindowIconBadge(this, badge);
- }
Taskbar.Feature.ICON_IMAGE
Метод: taskbar.setIconImage()
Изменяет иконку приложения в панели задач.
- if (taskbar.isSupported(Taskbar.Feature.ICON_IMAGE)) {
- Image icon = ImageIO.read("icon.png");
- taskbar.setIconImage(icon);
- }
Taskbar.Feature.MENU
Методы: taskbar.getMenu() и taskbar.setMenu(PopupMenu menu)
Позволяет добавить или изменить меню на иконке приложения в панели задач.
- if (taskbar.isSupported(Taskbar.Feature.MENU)) {
- final PopupMenu popup = new PopupMenu();
- popup.add("Item 1");
- popup.add("Item 2");
- taskbar.setMenu(popup);
- }
Taskbar.Feature.PROGRESS_STATE_WINDOW
Метод: taskbar.setWindowProgressState(Window w, Taskbar.State atate)
Устанавливает состояние прогресса на иконке указанного окна.
- if (taskbar.isSupported(Taskbar.Feature.PROGRESS_STATE_WINDOW)) {
- taskbar.setWindowProgressState(this, Taskbar.State.PAUSED);
- }
На рисунке показаны состояния NORMAL, PAUSED и ERROR соответственно:
Taskbar.Feature.PROGRESS_VALUE
Метод: taskbar.setProgressValue(int value)
Изменяет значение индикатора прогресса для иконки приложения. Значение должно быть от 0 до 100.
- if (taskbar.isSupported(Taskbar.Feature.PROGRESS_VALUE)) {
- taskbar.setProgressValue(50);
- }
Taskbar.Feature.PROGRESS_VALUE_WINDOW
Метод: taskbar.setWindowProgressValue(Window w, int value)
Изменяет значение индикатора прогресса для иконки указанного окна. Значение должно быть от 0 до 100.
- if (taskbar.isSupported(Taskbar.Feature.PROGRESS_VALUE_WINDOW)) {
- taskbar.setWindowProgressValue(this, 50);
- }
Taskbar.Feature.USER_ATTENTION
Метод: taskbar.requestUserAttention(enabled, critical)
Привлекает внимание пользователя мигаем или дрожанием окна (зависит от платформы).
- if (taskbar.isSupported(Taskbar.Feature.USER_ATTENTION)) {
- taskbar.requestUserAttention(true, false);
- }
Taskbar.Feature.USER_ATTENTION_WINDOW
Метод: taskbar.requestWindowUserAttention(Window w)
Привлекает внимание пользователя к указанному окну.
- if (taskbar.isSupported(Taskbar.Feature.USER_ATTENTION_WINDOW)) {
- taskbar.requestWindowUserAttention(this);
- }
Ограничения
К сожалению, на Linux поддерживается только Unity, да и то, её необходимо включать специальным параметром JVM в .desktop файле, которое запускает приложение:
- Exec=java -Djava.desktop.appName=MyApp.desktop -jar /path/to/myapp.jar
Но даже так ничего не работало. Возможно к релизу Java 9 исправят.
Проект на GitHub: https://github.com/annimon-tutorials/Java-9-Taskbar-Demo