KeyboardFocusManager.getFocusOwner() 返 回 当 前 的 焦 点 所 有 者 。
DefaultKeyboardFocusManager
类对 AWT 应用程序是作为缺省提供的。您当然可以选用自
己的 KeyboardFocusManager 类来替代该焦点模型。但是,倘若本机的焦点策略复杂的话,
建议您还是建立 KeyboardFocusManager
或 DefaultKeyboardFocusManager 的子类吧。
AWT
焦点子系统的前一个发行版因其轻量级的或重量级的组件类型和拥有 Java 虚拟机
平台的不一致行为而受挫。因为重量级的组件实施使用一个独立的本机窗口(AWT 组件),
对于本机焦点系统它们是可信赖的。轻量级的(
基于 Swing 的)组件在不同平台上的外观和
感觉都相同。 KeyboardFocusManager 解决了这种不一致,确保了轻量级和重量级组件所
有和焦点相关的动作和查询都成为可能。
确定当前的焦点所有者和焦点窗口
当前的焦点所有者是新的 AWT 焦点模型中的一个关键元素。所有遍历操作都从当前
的焦点所有者或从另一个被虚拟的认作焦点所有者的组件开始。每个给定时间只能有一个
当前的焦点所有者。当 前的焦点所有者是个已收到 FOCUS_GAINED
事件 ― 但还未收到
FOCUS_LOST 事件的组件(有关这些事件的更多信息,请参阅下面的内容)。
您使用 KeyboardFocusManager.getFocusOwner() 来确定当前的焦点所有者。如果该焦
点所有者未和调用线程处于同一个上下文中,那么该方法会返回空。因此,您应该在代码
中使用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() 。这样,
“
只有当焦点被设置成 无组件(no component)”
时才会返回空。此外,该 Component 类提供
了 isFocusOwner() 方法,如果该组件是焦点所有者,那么这个方法就返回真。
同 样 , 拥 有 焦 点 的 窗 口 就 是 包 含 当 前 的 焦 点 所 有 者 的 窗 口 。
KeyboardFocusManager.getFocusedWindow() 返回的拥有焦点的窗口和调用线程处在相同的
上
下
文
中
。
再
说
一
遍
,
您
应
该
使
用
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow() 来确保该拥
有焦点的窗口和调用线程处在相同的上下文中。
确定焦点更改中的对立组件
一些窗口和组件的焦点事件含有相应的对立事件。这样的事件集有:
FOCUS_LOST
和 FOCUS_GAINED
WINDOW_ACTIVATED
和 WINDOW_DEACTIVATED
WINDOW_LOST_FOCUS
和 WINDOW_GET_FOCUS
当调遣其中的一个事件时,总是同时调遣了这个事件的对立事件。焦点更改的对立组
件只是个获取对立事件的组件。例如,当一个组件获得了焦点时,其对立组件就是那个失
去该焦点的组件。
FocusEvent.getOppositeComponent()
方法和 WindowEvent.getOppositeWindow() 方法返
回焦点更改所涉及的对立组件或窗口。上面列出的六个焦点事件和这两个方法密切相关。
当一个窗口得到一个 WINDOW_DEACTIVATED
事件时, getOppositeWindow() 方法查找
获取 WINDOW_ACTIVATED 事件的窗口。如果其对立组件或窗口处于一个不同的上下文,
这些方法中每一个都会返回空。
正如 AWT
焦点子系统规范中所定义的,一个 焦点遍历循环是一组被定义过的组件,组
中的每个组件(组外没有组件)会在前序或后序焦点遍历中被遍历到。
焦 点 遍 历 循 环 中 每 个 组 件 都 有 自 己 的 上 一 个 组 件 和 下 一 个 组 件 。
KeyboardFocusManager 类提供了在给定的遍历循环中传递焦点,或者甚至更改焦点遍历
循环的方法。