Java 9. java.awt.Taskbar

от
Java    java 9, java.awt.Taskbar

В Java 9 добавлен специальный класс для взаимодействия с панелью задач. Таким образом, можно более тесно интегрировать Java-приложение с операционной системой.

Однако не все системы имеют панель задач, поэтому сперва следует проверить её поддержку:
  1. if (!Taskbar.isTaskbarSupported()) {
  2.     System.out.println("Taskbar is not supported");
  3.     return;
  4. }

Список поддерживаемых методов в Taskbar тоже ограничен, поэтому перед использованием метода нужно проверить, что действие, которое он выполняет, поддерживается. Для этого есть метод boolean isSupported(Taskbar.Feature) и класс перечислений Taskbar.Feature. Код:
  1. final Taskbar taskbar = Taskbar.getTaskbar();
  2. Arrays.stream(Taskbar.Feature.values())
  3.         .filter(taskbar::isSupported)
  4.         .forEach(System.out::println);
выведет на 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)

Добавляет к иконке приложения текстовую метку. Обычно это может быть число новых уведомлений или непрочитанных сообщений. Некоторые платформы поддерживают только числа в таких метках, поэтому передавать следует число в текстовом представлении:
  1. if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_TEXT)) {
  2.     taskbar.setIconBadge("99+");
  3. }
  4. if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_NUMBER)) {
  5.     taskbar.setIconBadge("4");
  6.     taskbar.setIconBadge(Integer.toString(numberOfNotifications));
  7. }


Taskbar.Feature.ICON_BADGE_IMAGE_WINDOW
Метод: taskbar.setWindowIconBadge(Window w, Image badge)

Добавляет к иконке указанного окна метку в виде изображения. На Windows 7 хоть и писало, что поддерживается, но к иконке ничего не добавлялось, зато на Windows 10 всё работает.

  1. if (taskbar.isSupported(Taskbar.Feature.ICON_BADGE_IMAGE_WINDOW)) {
  2.     Image badge = ImageIO.read("badge.png");
  3.     taskbar.setWindowIconBadge(this, badge);
  4. }
Icon badge


Taskbar.Feature.ICON_IMAGE
Метод: taskbar.setIconImage()

Изменяет иконку приложения в панели задач.

  1. if (taskbar.isSupported(Taskbar.Feature.ICON_IMAGE)) {
  2.     Image icon = ImageIO.read("icon.png");
  3.     taskbar.setIconImage(icon);
  4. }


Taskbar.Feature.MENU
Методы: taskbar.getMenu() и taskbar.setMenu(PopupMenu menu)

Позволяет добавить или изменить меню на иконке приложения в панели задач.

  1. if (taskbar.isSupported(Taskbar.Feature.MENU)) {
  2.     final PopupMenu popup = new PopupMenu();
  3.     popup.add("Item 1");
  4.     popup.add("Item 2");
  5.     taskbar.setMenu(popup);
  6. }


Taskbar.Feature.PROGRESS_STATE_WINDOW
Метод: taskbar.setWindowProgressState(Window w, Taskbar.State atate)

Устанавливает состояние прогресса на иконке указанного окна.

  1. if (taskbar.isSupported(Taskbar.Feature.PROGRESS_STATE_WINDOW)) {
  2.     taskbar.setWindowProgressState(this, Taskbar.State.PAUSED);
  3. }

На рисунке показаны состояния NORMAL, PAUSED и ERROR соответственно:
Progress state


Taskbar.Feature.PROGRESS_VALUE
Метод: taskbar.setProgressValue(int value)

Изменяет значение индикатора прогресса для иконки приложения. Значение должно быть от 0 до 100.

  1. if (taskbar.isSupported(Taskbar.Feature.PROGRESS_VALUE)) {
  2.     taskbar.setProgressValue(50);
  3. }


Taskbar.Feature.PROGRESS_VALUE_WINDOW
Метод: taskbar.setWindowProgressValue(Window w, int value)

Изменяет значение индикатора прогресса для иконки указанного окна. Значение должно быть от 0 до 100.

  1. if (taskbar.isSupported(Taskbar.Feature.PROGRESS_VALUE_WINDOW)) {
  2.     taskbar.setWindowProgressValue(this, 50);
  3. }

Progress value


Taskbar.Feature.USER_ATTENTION
Метод: taskbar.requestUserAttention(enabled, critical)

Привлекает внимание пользователя мигаем или дрожанием окна (зависит от платформы).

  1. if (taskbar.isSupported(Taskbar.Feature.USER_ATTENTION)) {
  2.     taskbar.requestUserAttention(true, false);
  3. }


Taskbar.Feature.USER_ATTENTION_WINDOW
Метод: taskbar.requestWindowUserAttention(Window w)

Привлекает внимание пользователя к указанному окну.

  1. if (taskbar.isSupported(Taskbar.Feature.USER_ATTENTION_WINDOW)) {
  2.     taskbar.requestWindowUserAttention(this);
  3. }

User attention window


Ограничения
К сожалению, на Linux поддерживается только Unity, да и то, её необходимо включать специальным параметром JVM в .desktop файле, которое запускает приложение:
  1. Exec=java -Djava.desktop.appName=MyApp.desktop -jar /path/to/myapp.jar

Но даже так ничего не работало. Возможно к релизу Java 9 исправят.
Ubuntu



Проект на GitHub: https://github.com/annimon-tutorials/Java-9-Taskbar-Demo
  • +5
  • views 5909