AWT 桌面属性

以下是指可以通过 Toolkit.getDesktopProperty 方法获取的标准 AWT 桌面属性。

每个桌面属性都由一个唯一的字符串命名,即该属性的“名称”。

AWT 支持但未在其他地方记录的桌面属性(通常是因为没有合适的方法或类)记录在此处。

其他地方记录的桌面属性是那些与记录它们的方法或类紧密耦合的属性。

由于桌面属性抽象了底层平台设置,因此它们在不支持它们的环境中可能不可用。如果桌面属性因任何原因不可用,该实现将返回 null

下表总结了此处记录的桌面属性及其值类型。
属性名称 值类型 概要说明
awt.font.desktophints java.util.Map 字体平滑(文本抗锯齿)设置。
sun.awt.enableExtraMouseButtons java.lang.Boolean 控制是否要生成来自额外按钮的鼠标事件

桌面字体呈现提示

桌面属性:“awt.font.desktophints”

现代桌面支持各种形式的文本抗锯齿(字体平滑)。

这些由特定于平台的重量级组件应用。但是,应用程序可能希望使用Graphics2D 方法在绘图表面或轻量级(非平台)组件上使用相同的文本抗锯齿来呈现文本。这在创建需要与本机桌面组件或其他 Swing 组件保持一致的 Swing components 时尤为重要。

基本用法

名为的标准桌面属性“awt.font.desktophints”可用于获取与桌面设置最匹配的呈现提示。返回值是 RenderingHints Map ,可以直接应用于 Graphics2D

它是 Map,因为可能需要不止一个提示。如果非空,这可以直接应用于 Graphics2D


Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
if (map != null) {
  graphics2D.addRenderingHints(map);
}
 

高级使用技巧

监听变化

应用程序可以使用 PropertyChangeListener 监听属性的变化:


tk.addPropertyChangeListener("awt.font.desktophints", pcl);
 
建议监听更改,因为在极少数情况下,用户可以在应用程序以可能影响这些提示选择的方式运行时重新配置桌面环境,而且许多桌面环境支持动态重新配置这些正在运行的应用程序以符合新设置。

没有直接的方法可以发现正在运行的应用程序是否需要动态重新配置,但默认假设应该是预期的,因为大多数现代桌面环境都提供此功能。

文本测量

文本始终需要使用与用于渲染相同的FontRenderContext 来测量。文本抗锯齿提示是 FontRenderContext 的一个组成部分。从已设置提示的 Graphics 对象获得的 FontMetrics 将适当地测量文本。这不是直接指定此提示的客户端的唯一要求,因为永远不应假设 FontRenderContext 的值,因此在这里主要作为提醒进行讨论。

保存和恢复图形状态

有时,应用程序可能只需要暂时将这些提示应用于共享图形,在将它们应用于文本呈现操作后恢复以前的值。以下示例代码显示了一种执行此操作的方法。


/**
 * Get rendering hints from a Graphics instance.
 * "hintsToSave" is a Map of RenderingHint key-values.
 * For each hint key present in that map, the value of that
 * hint is obtained from the Graphics and stored as the value
 * for the key in savedHints.
 */
RenderingHints getRenderingHints(Graphics2D g2d,
                 RenderingHints hintsToSave,
                 RenderingHints savedHints) {
   if (savedHints == null) {
     savedHints = new RenderingHints(null);
   } else {
     savedHints.clear();
   }
   if (hintsToSave.size() == 0) {
     return savedHints;
   }
   /* RenderingHints.keySet() returns Set<Object> */
   for (Object o : hintsToSave.keySet()) {
     RenderingHints.Key key = (RenderingHints.Key)o;
     Object value = g2d.getRenderingHint(key);
     savedHints.put(key, value);
   }
   return savedHints;
}


Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Map oldHints;
if (map != null) {
   oldHints = getRenderingHints(graphic2D, map, null);
   graphics2D.addRenderingHints(map);
   ..
   graphics2D.addRenderingHints(oldHints);
}
 

细节

  • 返回值将始终为 null 或 Map

  • 如果返回值为 null,则没有桌面属性可用,动态更新将不可用。这是 JDK 无法识别桌面环境或没有此类设置的典型行为。这无头工具包就是这样一个示例。因此,在使用map之前针对 null 进行测试很重要。

  • 如果非空,则该值将是 MapRenderingHints,这样每个键都是 RenderingHints.Key 的实例,并且该值是该键的合法值。

  • 该map可能包含提示的默认值。如果之前在 Graphics2D 上设置了非默认值,则需要这样做。如果map不包含默认值,则 addRenderingHints(Map) 将保留先前的提示,这可能与桌面设置不对应。

    应用程序可以使用 setRenderingHints(Map) 重新初始化所有提示,但这也会影响不相关的提示。

  • 多屏桌面可能支持每屏设备设置,在这种情况下返回的值是桌面的默认屏幕。应用程序可能希望使用将应用它们的屏幕的设置。每个屏幕的设备提示可以通过每个设备的属性名称获得,这些属性名称被构造为字符串连接
    
    "awt.font.desktophints" + "." + GraphicsDevice.getIDstring();
     

    应用程序还可以监听这些属性的变化。

    然而,这是一个极不可能的配置,因此为了帮助简化开发,如果只支持一个桌面范围的设置,那么查询每个设备设置都将返回 null。因此,要确定是否存在每设备设置,只需使用每设备属性名称确定任何屏幕设备是否返回非空值即可。

鼠标功能

桌面属性:“sun.awt.enableExtraMouseButtons”

此属性确定是否允许处理来自额外鼠标按钮的事件(如果它们存在并且由底层操作系统启用)并将其发布到 EventQueue 中。
在应用程序启动之前,可以通过将“sun.awt.enableExtraMouseButtons”属性值传递给 java 来更改该值。这可以通过以下命令完成:

java -Dsun.awt.enableExtraMouseButtons=false Application
一旦在应用程序启动时设置,之后就无法更改此值。
也可以使用 getDesktopProperty("sun.awt.enableExtraMouseButtons") 方法查询当前值。
如果该属性设置为 true 那么
  • 使用标准按钮创建 MouseEvent 对象仍然是合法的,如果鼠标有三个以上的按钮,使用范围从 0 到 getNumberOfButtons() 的按钮也是合法的。
  • 在使用 Robot.mousePress()Robot.mouseRelease() 方法时使用标准按钮掩码是合法的,如果鼠标有超过三个按钮,则对现有的扩展鼠标按钮使用掩码也是合法的。这样,如果鼠标上有超过三个按钮,则允许使用与从 1 到 getNumberOfButtons() 范围内的按钮相对应的按钮掩码

如果该属性设置为 false 那么
  • 仅使用标准按钮创建 MouseEvent 对象是合法的:NOBUTTONBUTTON1BUTTON2BUTTON3
  • 仅使用标准按钮掩码是合法的:InputEvent.BUTTON1_DOWN_MASKInputEvent.BUTTON2_DOWN_MASKInputEvent.BUTTON3_DOWN_MASK
当不需要监听由于具有额外鼠标按钮的活动而触发的鼠标事件时,应使用此属性。默认情况下,此属性设置为 true