Skip to content

JEP 272: Platform-Specific Desktop Features | 平台特定的桌面功能

摘要

定义一个新的公共 API 来访问平台特定的桌面功能,例如与任务栏或 dock 交互,或监听系统或应用程序事件。

目标

在 JDK 9 之后的版本中,像 Mac OS X com.apple.eawt 包中的这些内部 API 将无法访问。这个 JEP 的目标是为这些不可访问的 API 提供合适的替代品,并引入相关的平台特定功能。我们计划在具有必要支持的平台上实现新功能。在可行的情况下,API 将被设计为跨平台,以便尽可能广泛地实现每个功能。正在删除 apple.applescript 类而没有提供任何替代品。

非目标

我们不打算为 JDK 8 中存在的所有内部 OS X API 提供直接替代品。具体来说,我们不会为 com.apple.concurrent 包提供替代方案。我们也不打算为我们提供替代方案的内部 API 保持兼容性。

描述

该 JEP 包含两个子任务:

提供公共 API 以替换 com.apple.{eawt,eio} 中的功能

这个子任务的目的是避免 OS X 开发人员失去功能。我们将为 JDK 内部的 com.apple.eawtcom.apple.eio 包中的 API 提供替代品。

在其他平台上提供类似的功能

除了 OS X 特定的功能外,在其他平台上也有类似的功能,包括 Windows 和 Linux:

  • 登录 / 注销和屏幕锁定处理程序:提供系统登录 / 注销(或屏幕锁定 / 解锁)事件侦听器,允许应用程序在需要时启动持久任务或保存其状态。

  • 任务栏 /dock 交互

    • 请求用户关注:允许应用程序请求用户的关注,使用平台功能,如在任务栏中闪烁应用程序图标或在 dock 中弹起图标。

    • 指示任务进度:在任务栏 /dock 中显示进度条或其他指示器。

    • 动作快捷方式:提供可通过弹出菜单访问的动作快捷方式,例如 Windows 跳转列表。

这些功能的支持将由平台能力确定。

API

我们建议将这两个子任务的公共 API 添加到现有的 java.awt.Desktop 类中。目标支持的平台是 Mac OS X,Windows,Linux。

建议的 API 概述:

java
package java.awt;

public class Desktop {

    /* ... */

    /**
     * 添加 {@link AppEventListener} 的子类型以侦听来自本地系统的通知。
     *
     * @param listener
     * @see AppForegroundListener
     * @see AppHiddenListener
     * @see AppReOpenedListener
     * @see AppScreenSleepListener
     * @see AppSystemSleepListener
     * @see AppUserSessionListener
     */

    public void addAppEventListener(final AppEventListener listener) {}

    /**
     * 请求用户关注此应用程序(通常通过弹起 Dock 图标)。
     * 重要请求将继续弹起 Dock 图标,直到激活应用程序为止。
     *
     */
    public void requestUserAttention(final boolean critical) {}

    /**
     * 将提供的 PopupMenu 的内容附加到应用程序的 Dock 图标。
     */
    public void setDockMenu(final PopupMenu menu) {}

    /**
     * 将此应用程序的 Dock 图标更改为提供的图像。
     */
    public void setDockIconImage(final Image image) {}

    /**
     * 在此应用程序的 Dock 图标上附加一个小型系统提供的徽章。通常是数字。
     */
    public void setDockIconBadge(final String badge) {}

    /**
     * 在 dock 中显示或隐藏进度条或其他指示器。
     *
     * @see DockProgressState.NORMAL
     * @see DockProgressState.PAUSED
     * @see DockProgressState.ERROR
     *
     * @see #setDockProgressValue
     */
    public void setDockProgressState(int state) {}

    /**
     * 将进度条的当前值设置为 {@code n}。
     */
    public void setDockProgressValue(int n) {}

    /**
     * 测试当前平台是否支持某个功能。
     */

    public boolean isSupportedFeature(Feature f) {}

    /* ... */
}

测试

测试将仅限于编写使用新 API 的其他手动测试。测试需要检查新功能是否在预期支持它们的平台上受支持,并且在没有支持的平台上优雅地失败。