跳到主要内容

JEP 272:特定于平台的桌面功能

概括

定义新的公共 API 来访问特定于平台的桌面功能,例如与任务栏或扩展坞交互,或者侦听系统或应用程序事件。

目标

在即将发布的 JDK 9 中,内部 API(例如 Mac OS Xcom.apple.eawt包中的 API)将不再可访问。该 JEP 的目标是为这些无法访问的 API 提供合适的替代品,并引入相关的特定于平台的功能。我们计划在那些拥有必要支持的平台上实施新功能。在可行的情况下,API 将被设计为跨平台的,以便每个功能都可以在尽可能广泛的平台上实现。apple.applescript课程正在被删除,但没有提供任何替代。

非目标

我们不打算为 JDK 8 中存在的所有内部 OS X API 提供直接替换。具体来说,我们不会为该com.apple.concurrent包提供替换。保持与我们确实提供替代品的内部 API 的兼容性难道不是一个目标吗?

描述

该 JEP 包含两个子任务:

提供公共API来替换中的功能com.apple.{eawt,eio} {#Provide-public-API-to-replace-the-functionality-in-com-apple-{eawteio}}

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

提供对其他平台上类似功能的访问

除了 OS X 特有的功能外,其他平台(包括 Windows 和 Linux)也支持类似的功能:

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

  • 任务栏/dock交互

    • 请求用户注意:允许应用程序使用平台功能(例如在任务栏中闪烁应用程序图标或在 Dock 中弹起图标)来请求用户注意。

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

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

对这些功能的支持将由平台功能决定。

应用程序编程接口

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

建议的 API 草图:

package java.awt;

public class Desktop {

/* ... */

/**
* Adds sub-types of {@link AppEventListener} to listen for notifications
* from the native system.
*
* @param listener
* @see AppForegroundListener
* @see AppHiddenListener
* @see AppReOpenedListener
* @see AppScreenSleepListener
* @see AppSystemSleepListener
* @see AppUserSessionListener
*/

public void addAppEventListener(final AppEventListener listener) {}

/**
* Requests user attention to this application (usually through bouncing the Dock icon).
* Critical requests will continue to bounce the Dock icon until the app is activated.
*
*/
public void requestUserAttention(final boolean critical) {}

/**
* Attaches the contents of the provided PopupMenu to the application's Dock icon.
*/
public void setDockMenu(final PopupMenu menu) {}

/**
* Changes this application's Dock icon to the provided image.
*/
public void setDockIconImage(final Image image) {}


/**
* Affixes a small system provided badge to this application's Dock icon. Usually a number.
*/
public void setDockIconBadge(final String badge) {}

/**
* Displays or hides a progress bar or other indicator in
* the dock.
*
* @see DockProgressState.NORMAL
* @see DockProgressState.PAUSED
* @see DockProgressState.ERROR
*
* @see #setDockProgressValue
*/
public void setDockProgressState(int state) {}

/**
* Sets the progress bar's current value to {@code n}.
*/
public void setDockProgressValue(int n) {}

/**
* Tests whether a feature is supported on the current platform.
*/

public boolean isSupportedFeature(Feature f) {}

/* ... */
}

测试

测试将仅限于为使用新 API 编写的额外手动测试。测试需要检查新功能是否在预期支持的平台上受支持,以及它们在不支持的平台上是否正常失败。