JEP 272: 平台特定的桌面功能
概述
定义一个新的公共 API,用于访问特定于平台的桌面功能,例如与任务栏或程序坞进行交互,或者监听系统或应用程序事件。
目标
在即将发布的 JDK 9 中,内部 API(例如 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}
中的功能 {#Provide-public-API-to-replace-the-functionality-in-com-apple-{eawteio}}
此子任务的目的是避免 OS X 开发人员功能丧失。我们将为 JDK 内部的 com.apple.eawt
和 com.apple.eio
包中的 API 提供替代方案。
在其他平台提供对类似功能的访问
除了特定于 OS X 的功能外,还有其他平台(包括 Windows 和 Linux)可以支持的类似功能:
-
登录/登出和屏幕锁定处理程序:提供系统登录/登出(或屏幕锁定/解锁)的事件监听器,以允许应用程序在需要时启动持久任务或保存其状态。
-
任务栏/底座交互
-
请求用户注意:允许应用程序使用平台功能请求用户的注意,例如在任务栏中闪烁应用程序图标或在底座中弹跳图标。
-
指示任务进度:在任务栏/底座中显示进度条或其他指示器。
-
动作快捷方式:提供可通过弹出菜单访问的动作快捷方式,例如,Windows 跳转列表。
-
对这些功能的支持将由平台功能决定。
API
我们建议将这两个子任务的公共 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 而编写的其他手动测试。测试需要检查新功能是否在预计支持它们的平台上得到支持,并且在不支持它们的平台上能够优雅地失败。